/ / conteggio dei valori uniq nella matrice non funzionante - perl, hash, mappa, conteggio

il conteggio dei valori uniq nella matrice non funziona: perl, hash, mappa, conteggio

questo è il mio codice per contare i valori uniq nell'array perl e metterli nell'array hash

@array=$_[0];

print Dumper @array;

my %counts;

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

L'output è:

$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
};

Perché l'array hash è vuoto ?? E cosa fare per contare i valori di uniq?

risposte:

11 per risposta № 1

Hai un array ref in $_[0], che è dimostrato dal Data::Dumper produzione

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

Quindi quando lo fai

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

Stai modificando l'array ref, che diventa ARRAY(0x180c844) o alcuni di questi, e quindi la sua chiave viene incrementata.

Come risolvere il problema: Dereferenzia $_[0]. Copialo sull'array o usalo direttamente.

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

o

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

Tieni presente che quando si controllano i numeri univoci, è possibile che si verifichino problemi se i numeri che hanno un aspetto diverso devono essere considerati uguali, ad es. 1.0 e 1. Potresti voler normalizzare preventivamente i numeri, in questo modo:

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

0 per risposta № 2

Stai semplicemente copiando la matrice in un riferimento di matrice. Perl è interpretato contestualmente.

Provare:

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

print Dumper @array;

my %counts;

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

Edit: Ho usato il mio input in un primo momento e non l'array-ref nella variabile iniziale ... la dereferenziazione proposta dovrebbe risolverlo.