2009-06-16 22 views
42

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

疑問は、なぜあなたもそれと悩まれていますか?存在しなければ、$ nはundefになります。 Undefの数値は0なので、$ n + 1 = 1です。最初にハッシュに存在するかどうかを確認する必要はありません。 –

答えて

95

私はキーがハッシュに存在するかどうかをチェックするために信じて、私はこのコードは、あなたの質問に答える必要があることを推測する

if (exists $strings{$string}) { 
    ... 
} else { 
    ... 
} 
+13

はperlは鍵があなたの最後のハッシュ存在で探している場合は、「チェック」するために、多次元ハッシュに存在しない任意の中間のキーをautovivicateすることに注意してください。この例のような単純なハッシュでは問題はありませんが、.. my%test =(); "バー" if(exists $ test {'foo'} {'bar'}); #perlのは、ちょうどバー プリントを探すために、fooというキー「fooが今存在し、それを期待していない可能性があります!」自動活性化if(exists $ test {'foo'}); – Drew

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

を見つかりました。

+0

ええ、物事は私がキーが何であるかを事前に知らないということです。 –

+1

はい、この目的のためにキーの存在を確認する必要はありません。あなたは単に$ strings {$ 1} ++と言うことができます。キーが存在しない場合、値としてundefが追加されます。これは++が0と解釈します。 – Arkadiy

+0

確かに。ポイントは、$ string {$ 1} ++でサイクルの全身を(ifの下で)置き換えることができるということです。 – zoul

-1

あなただけで行くことができます。

if(!$strings{$string}) .... 
+0

うん「を編集」で流れを台無しに。ありがとう! –

+7

これは、すべてのキーがfalseでない値を持つ場合にのみ機能します。一般的に、それは悪い仮定です。 exists()を使用してください。これは特にこれのために設計されています。 –

+2

@brian de foy - ああ。 –

9

さて、あなたの全体のコードはに制限することができます。値が存在しない場合には、++演算子は0であることを、それを前提とします

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

(そして1に増分します)。既に存在する場合は、単にインクリメントされます。私はそれがキーが存在するが、その値がゼロまたは空の場合は何を期待しないだろうので、if ($hash{$key})を使用に対する助言だろう

+0

あなたの答えは真ですが、それはハッシュについての質問に答えます。 – Chris

9

+1

これらの特定の状況は、ネストされたキーの場合のみです。この問題に対しては、存在が答えです。 1回のショットでネストされたキーを使用しないでください。 –

+1

Downvoteは依然として少し厳しいですが、警告はこの質問のスクリプトの単純さによって無効にされません。もっと重要な点は、if($ hash {$ key})を定義済みでも存在しないで使っても問題ではないということです。 – RET

+0

"ゼロではありますが真実"のものはアップボートに値する。しかし、あなたがオートバイ化について言ったことは、単に間違っていて、ダウンボートに値する。 – innaM

関連する問題