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;
        }
    }
}
War es hilfreich?

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}) ....
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top