Comment puis-je voir si un hachage Perl a déjà une certaine clé?
Question
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 un meilleur moyen de le faire?
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;
}
}
}
La solution
Je crois que pour vérifier si une clé existe dans un hachage que vous venez de faire
if (exists $strings{$string}) {
...
} else {
...
}
Autres conseils
Je vous déconseille d'utiliser si ($ hash {$ key})
car il ne fera pas ce que vous attendez si la clé existe mais que sa valeur est zéro ou vide.
Eh bien, tout votre code peut être limité à:
foreach $line (@lines){
$strings{$1}++ if $line =~ m|my regex|;
}
Si la valeur n'est pas présente, l'opérateur ++ suppose qu'elle est égale à 0 (puis incrémentée à 1). Si elle existe déjà, elle sera simplement incrémentée.
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 comme suit:
$hash{ 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 comme suit:
$hash{ 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 comme suit:
$hash{ 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 comme suit:
<*>
(Voir $ _
dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:
<*>
Qui signale chaque clé la première fois qu'elle est trouvée.
}++ for (@keys);
(Voir $ _
dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:
<*>
Qui signale chaque clé la première fois qu'elle est trouvée.
}++ or print "Found new value: 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 comme suit:
$hash{ 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 comme suit:
<*>
(Voir $ _
dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:
<*>
Qui signale chaque clé la première fois qu'elle est trouvée.
}++ for (@keys);
(Voir $ _
dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:
<*>
Qui signale chaque clé la première fois qu'elle est trouvée.
.\n" for (@keys);
(Voir $ _
dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:
<*>
Qui signale chaque clé la première fois qu'elle est trouvée.
}++ for (@keys);
(Voir $ _
dans perlvar .) Et vous pouvez même écrire quelque chose comme ça:
Qui signale chaque clé la première fois qu'elle est trouvée.
Vous pouvez simplement aller avec:
if(!$strings{$string}) ....