57

テキスト ファイル内のさまざまな文字列の出現回数をカウントする 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;
        }
    }
}
4

5 に答える 5

119

あなたが行ったハッシュにキーが存在するかどうかを確認すると思います

if (exists $strings{$string}) {
    ...
} else {
    ...
}
于 2009-06-16T20:05:53.190 に答える
10

if ($hash{$key})キーが存在するが、その値がゼロまたは空の場合、期待どおりに機能しないため、使用しないようにアドバイスします。

于 2009-06-16T21:29:52.177 に答える
9

さて、コード全体を次のように制限できます。

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

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

于 2009-06-16T21:01:47.133 に答える
6

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

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);

( perlvar$_を参照してください。) そして、次のように書くことさえできます:

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

最初に見つかったときに各キーを報告します。

于 2009-06-16T20:05:54.593 に答える
-1

あなたはただ行くことができます:

if(!$strings{$string}) ....
于 2009-06-16T20:06:50.613 に答える