2011-08-07 10 views
7

以下は、ある種のループの中で配列のハッシュを構築したいときに書き留めなければならないコードブロックの一般化です。配列のハッシュに新しい値を追加するための短縮形

#get value and key that I want to use 
my $value = getvalue(); 
my $key = getKey(); 

#add value to hash using key 
if($hash_of_arrays{$key}){ 
    push(@{$hash_of_arrays{$key}}, $value); 
} 
else{ 
    $hash_of_arrays{$key} = [$value]; 
} 

if文は、このような単純なタスクのために書くのは非常に面倒ですが、それはそのキーがハッシュに定義されていない値をプッシュすると、問題が発生するために行われる必要がある場合。私はちょうどこれを書くための省略表現があるかどうか疑問に思っています - 私が書かなければならないものは$hash_of_arrays{$key} 3回です。

答えて

14

push @{ $HoA{$key} }, $value;は正常に動作し、推奨されることです。それを使用するコードに「問題」がある場合は、代わりにそれらの問題について質問してください。

+0

さて、私が最後に試したときに、どのようにエラーが発生したのかよく分かりません。私はそれが "ARRAYリファレンスではない"エラーを引き起こしたと思ったが、未定義の変数では起こりそうにない。ありがとう! – MattLBeck

+0

これはundefsには起こりませんが、配列参照として扱う前に '$ HoA {$ key} 'に文字列のようなものを置くと起こります。 – hobbs

+2

このメソッドは、自動ウイルス対策と呼ばれます。 Brian d Foyには、それをオフにする方法に関する記事があります:http://www.effectiveperlprogramming.com/blog/1256 – shawnhcorey

0

直感的には、コードを繰り返しているときは、これを行う関数またはオブジェクトを作成してください。

ただし、この具体的なケースでは、Perl Recipe 13.15: Tie Example: Make a Hash That Always Appendsをチェックしてください。ハッシュに値を代入するだけで、その配列に自動的に値を追加します。

関連する問題