web-dev-qa-db-fra.com

Comment puis-je voir si un hachage 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. Existe-t-il une meilleure façon de procéder?

Voici ce que je fais:

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

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

if (exists $strings{$string}) {
    ...
} else {
    ...
}
111
cpjolicoeur

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

10
RET

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

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

Si la valeur n'est pas là, l'opérateur ++ suppose qu'elle est égale à 0 (puis incrémente à 1). S'il est déjà là - il sera simplement incrémenté.

9
user80168

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

use strict;
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 signale chaque clé la première fois qu'elle est trouvée.

6
zoul