Comment puis-je voir si un hash Perl a déjà une certaine clé?

J’ai un script Perl qui compte le nombre d’occurrences de différentes chaînes dans un fichier texte. Je veux pouvoir vérifier si une certaine chaîne n’est pas encore une clé dans le hachage. Y a-t-il une meilleure façon de le faire?

Voici ce que je fais:

foreach $line (@lines){ if(($line =~ m|my regex|) ) { $ssortingng = $1; if ($ssortingng is not a key in %ssortingngs) # "ssortingngs" is an associative array { $ssortingngs{$ssortingng} = 1; } else { $n = ($ssortingngs{$ssortingng}); $ssortingngs{$ssortingng} = $n +1; } } } 

Je crois pour vérifier si une clé existe dans un hash que vous venez de faire

 if (exists $ssortingngs{$ssortingng}) { ... } else { ... } 

Je vous déconseille d’utiliser if ($hash{$key}) car il ne fera pas ce que vous attendez si la clé existe mais sa valeur est zéro ou vide.

Eh bien, tout votre code peut être limité à:

 foreach $line (@lines){ $ssortingngs{$1}++ if $line =~ m|my regex|; } 

Si la valeur n’est pas là, l’opérateur ++ supposera qu’il soit égal à 0 (puis à 1). S’il existe déjà, il sera simplement incrémenté.

Je suppose que ce code devrait répondre à votre question:

 use ssortingct; use warnings; my @keys = qw/one two three two/; my %hash; for my $key (@keys) { $hash{$key}++; } for my $key (keys %hash) { print "$key: ", $hash{$key}, "\n"; } 

Sortie:

 three: 1 one: 1 two: 2 

L’itération peut être simplifiée pour:

 $hash{$_}++ for (@keys); 

(Voir $_ in perlvar .) Et vous pouvez même écrire quelque chose comme ceci:

 $hash{$_}++ or print "Found new value: $_.\n" for (@keys); 

Qui rapporte chaque clé la première fois qu’elle est trouvée.

Vous pouvez simplement aller avec:

 if(!$ssortingngs{$ssortingng}) ....