Wie kann ich sehen, ob ein bereits Perl Hash einen bestimmten Schlüssel hat?
Frage
Ich habe ein Perl-Skript, das die Anzahl der Vorkommen von verschiedenen Zeichenketten in einer Textdatei zählt. Ich mag überprüfen können, ob eine bestimmte Zeichenfolge noch nicht ein Schlüssel in der Hash ist. Gibt es einen besseren Weg, dies überhaupt zu tun?
Hier ist, was ich tue:
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;
}
}
}
Lösung
Ich glaube, um zu überprüfen, ob ein Schlüssel in einem Hash existiert Sie gerade tun
if (exists $strings{$string}) {
...
} else {
...
}
Andere Tipps
Ich würde Rat gegen die Verwendung von if ($hash{$key})
da wird es nicht tun, was Sie erwarten, wenn der Schlüssel vorhanden ist, aber sein Wert ist Null oder leer ist.
Nun, Ihre gesamte Code kann begrenzt werden:
foreach $line (@lines){
$strings{$1}++ if $line =~ m|my regex|;
}
Wenn der Wert nicht vorhanden ist, ++ Operator es annehmen wird als 0 (und dann auf 1 erhöhen). Wenn es schon da ist -. Es wird einfach erhöht werden
Ich denke, dass dieser Code sollte Ihre Frage beantworten:
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";
}
Ausgabe:
three: 1
one: 1
two: 2
Die Iteration kann vereinfacht werden:
$hash{$_}++ for (@keys);
(Siehe $_
in perlvar .) Und Sie können sogar so etwas schreiben:
$hash{$_}++ or print "Found new value: $_.\n" for (@keys);
Welche jede Taste zum ersten Mal meldet er gefunden hat.
Sie können nur gehen mit:
if(!$strings{$string}) ....