2012-08-17 3 views
5

内の1つのステップでハッシュテーブルを移入現在:宣言とPerl

my $has_field = {}; 
map { $has_field->{$_} = 1 } @fields; 

を、私は、単一のステップでのインライン初期化を行うことができます方法はありますか? (つまり、私はそれを宣言してると同時に、それを移入?)

答えて

14

はちょうどそのようなハッシュリファレンスにドロップリストを作成するには、マップを使用します。

my $has_field = { map { $_ => 1 } @fields }; 
3

更新:申し訳ありませんが、これはそうではありません最初に$ has_fieldを宣言しなければならないので、正確に何をしたいのですか?

あなたはハッシュスライスを使用することができる:

@{$has_field}{@fields} = (1)[email protected]; 

右側が@fieldsのスカラー値(あなたの配列の要素、すなわち数)ずつ繰り返すx演算子を使用しています。同じ静脈で別のオプション:私はsmart matchがいったん値のための参照ハッシュやテストの作成などの2〜5倍の速することができ、それをテストしてみた

@{$has_field}{@fields} = map {1} @fields; 
+0

これは正しく動作しますが、 'use strict;'を使用するときは '$ has_field'を別途宣言する必要があります。それはまだ知っている良いトリックだ。 –

2

。だから、あなたはハッシュを何回のかなりの数を再利用しようとしている場合を除き、それはスマートな試合を行うことをお勧めします:

if ($cand_field ~~ \@fields) { 
    do_with_field($cand_field); 
} 

それは5.10以来、Perlは今ネイティブへの道を持っていることを覚えておくことは良いことです「これらの既知の値のうちのこのテストされていない値です」と尋ねると、それはスマートマッチです。

+0

この素晴らしいチップをありがとう。私は間違いなくそれを使うつもりです。 – dan1111

関連する問題