3

使用する前にハッシュキーが存在するかどうかを最初に「テスト」するためのより良い方法を探しています。私は現在、16進数を文字列にデコードするイベントログパーサーを書いています。デコードテーブルに16進数が含まれていることを確認できないため、新しい変数に値を割り当てる前に、まずキーがハッシュに存在するかどうかを確認する必要があります。だから私がたくさんやっていることは:

if ($MEL[$i]{type} eq '5024') {
  $MEL[$i]{decoded_inline} = $decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"}
    if exists ($decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"})
}

私が気に入らないのは、式$decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"}が私のコードに2回含まれていることです。上記の行のより良いまたはより短いバージョンはありますか?

4

3 に答える 3

4

これが「いい」とは思えませんが、表現を二度と言わないという目標を達成していると思います。この苦痛に値するかどうかはわかりませんが、気に留めておいてください。

my $foo = $decode_hash{checkpoint}; 
my $bar = $MEL[$i]{raw}[128]; 
if ($MEL[$i]{type} eq '5024') { 
  $MEL[$i]{decoded_inline} = $foo->{$bar} 
    if exists ( $foo->{$bar} ); 
} 
于 2012-11-17T12:08:38.410 に答える
2

はい、もっと簡単な方法があります。参照は配列またはハッシュにしか格納できないことをご存知ですか?まあ、それにはきちんとした副作用があります。ディープハッシュまたは配列スロットへの参照を取得して、それらをスカラー参照のように扱うことができます。不幸な副作用は、スロットが自動化されることですが、常にそのスロットに割り当てる予定で、最初にチェックを行いたい場合は、何度も入力しないようにするのは悪い方法ではありません。また、構造に繰り返しインデックスを付けます。

my $ref = \$decode_hash{checkpoint}{"$MEL[$i]{raw}[128]"};
unless ( defined( $$ref )) { 
    ...
    $$ref = {};
    ...
}
于 2012-11-18T05:00:31.310 に答える
1

既存のハッシュ要素が未定義の値を持つことができない限り、私はこれを書きます

if ($MEL[$i]{type} eq '5024') {
  my $value = $decode_hash{checkpoint}{$MEL[$i]{raw}[128]};
  $MEL[$i]{decoded_inline} = $value if defined $value;
}

(ハッシュキーを二重引用符で囲むことはできません。)

于 2012-11-17T15:55:21.150 に答える