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 № 1Hai 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.