web-dev-qa-db-ja.com

Perlハッシュに特定のキーが既にあるかどうかを確認するにはどうすればよいですか?

テキストファイル内のさまざまな文字列の出現回数をカウントするPerlスクリプトがあります。特定の文字列がまだハッシュのキーになっていないかどうかを確認できるようにしたいと思います。これを完全に行うより良い方法はありますか?

ここに私がやっていることがあります:

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

私はあなたがちょうどするハッシュにキーが存在するかどうかをチェックすると信じています

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

キーは存在するがその値がゼロまたは空の場合は期待どおりに動作しないため、if ($hash{$key})の使用に反対します。

10
RET

まあ、あなたのコード全体は次のものに制限できます:

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

値が存在しない場合、++演算子はそれが0であると仮定します(その後1に増分します)。既に存在する場合-単純にインクリメントされます。

9
user80168

このコードはあなたの質問に答えるべきだと思います:

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";
}

出力:

three: 1
one: 1
two: 2

反復は次のように簡略化できます。

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

(見る $_ in perlvar 。)そして、次のように書くこともできます。

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

どのキーが最初に見つかったときにそれを報告します。

6
zoul