/ / zliczanie wartości uniq w tablicy nie działa - perl, hash, map, count

zliczanie wartości uniq w tablicy nie działa - perl, hash, map, count

to jest mój kod do zliczania wartości uniq w tablicy perl i umieszczania ich w tablicy mieszającej

@array=$_[0];

print Dumper @array;

my %counts;

$counts{$_}++ for @array;
print Dumper(%counts);

Wynik to:

$VAR1 = [
-46,
"53",
11,
"84",
-2,
"47",
-7,
"72",
0,
"14",
-10,
"3",
-46,
"53",
11,
"84",
-2,
"47",
-7,
"72",
0,
"14",
-10,
"3"
];
$VAR1 = {
"ARRAY(0x180c844)" => 1
};

Dlaczego tablica hash jest pusta? A co zrobić, aby policzyć wartości uniq?

Odpowiedzi:

11 dla odpowiedzi nr 1

Masz referencję do tablicy $_[0], co zostało zademonstrowane przez Data::Dumper wydajność

$VAR1 = [ ....
#       ^-- array ref

Więc kiedy to zrobisz

$counts{$_}++ for @array;

Sztywizujesz referencję tablicy, która staje się ARRAY(0x180c844) lub niektóre takie, a następnie jego klucz jest zwiększany.

Jak naprawić: Dereference $_[0]. Skopiuj go do tablicy lub użyj bezpośrednio.

@array = @{$_[0]};

lub

$counts{$_}++ for @{$_[0]};

Zwróć uwagę, że podczas sprawdzania unikalnych liczb możesz napotkać problemy, jeśli liczby, które wyglądają inaczej, powinny być traktowane tak samo, np. 1.0 i 1. Możesz wcześniej znormalizować liczby, jak na przykład:

$counds{ 0+$_ }++ for @array;

0 dla odpowiedzi nr 2

Właśnie kopiujesz tablicę do odwołania do tablicy ... perl jest interpretowany kontekstowo.

Próbować:

@array=@{$_[0]};

print Dumper @array;

my %counts;

map { $counts{$_}++ } @array;
print Dumper(%counts);

Edycja: Użyłem najpierw własnych danych wejściowych, a nie tablicy-ref w początkowej zmiennej. Proponowany dereferencja powinna to naprawić.