5

現在、ルックアップテーブルを作成する場合は、次を使用します。

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

インライン初期化を1つのステップで実行する方法はありますか?(つまり、宣言するのと同時にデータを入力しますか?)

4

3 に答える 3

14

マップを使用してリストを作成し、次のようなハッシュ参照にドロップするだけです。

my $has_field = { map { $_ => 1 } @fields };
于 2012-08-17T14:55:29.413 に答える
3

更新: 申し訳ありませんが、最初に $has_field を宣言する必要があるため、これは正確には実行されません。

ハッシュ スライスを使用できます。

@{$has_field}{@fields} = (1)x@fields;

右側は、x演算子を使用して、@fields のスカラー値 (つまり、配列内の要素の数) ごとに 1 つを繰り返します。同じ流れの別のオプション:

@{$has_field}{@fields} = map {1} @fields;
于 2012-08-17T15:02:37.330 に答える
2

私がテストしたところ、スマートマッチは、ルックアップハッシュを作成して値を1回テストするよりも2〜5倍速くなる可能性があります。したがって、ハッシュを何度も再利用する場合を除いて、スマートマッチを実行するのが最善です。

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

5.10以降、Perlには、 「このテストされていない値はこれらの既知の値のいずれかであるか」を尋ねるネイティブな方法があり、スマートマッチであることを覚えておくとよいでしょう。

于 2012-08-17T15:40:23.087 に答える