Perlで `$ hash {$ key} | = {}`は何をしますか?
-
03-07-2019 - |
質問
私はハッシュ参照を使用するPerlで取り組んでいました。
最終的に、私の問題は次の行であることが判明しました。
$myhash{$key} |= {};
つまり、既に値が設定されている場合を除き、" $ myhash {$ key}に空のハッシュへの参照を割り当てます。
これを逆参照し、ハッシュ参照として使用しようとすると、文字列をハッシュ参照として使用することに関するインタープリターエラーが発生しました。
変更先:
if( ! exists $myhash{$key}) {
$myhash{$key} = {};
}
...物事を機能させました。
したがって、問題はありません。しかし、私は何が起こっていたのか興味があります。
誰でも説明できますか?
解決
文字列をハッシュ参照として使用する際にエラーが表示されるのは、間違った演算子を使用しているためです。 | =
は、「ビットごとの割り当て」を意味します。つまり、
$foo |= $bar;
は次と同じ
$foo = $foo | $bar
この例で起こっているのは、新しい匿名ハッシュ参照が文字列化され、 $ myhash {$ key}
の値とビット単位の論理和がとられていることです。さらに問題を混乱させるため、 $ myhash {$ key}
がその時点で未定義の場合、値はハッシュ参照の単純な文字列化であり、 HASH(0x80fc284)
。したがって、構造の大まかな検査を行うと、ハッシュ参照のように見えるかもしれませんが、そうではありません。以下は、 Data :: Dumper
:
perl -MData::Dumper -le '$hash{foo} |= { }; print Dumper \%hash'
$VAR1 = {
'foo' => 'HASH(0x80fc284)'
};
そして、正しい演算子を使用すると次のようになります:
perl -MData::Dumper -le '$hash{foo} ||= { }; print Dumper \%hash'
$VAR1 = {
'foo' => {}
};
他のヒント
Perlには、簡略表記の代入演算子があります。 || =
演算子は、論理演算子が最後に評価された値を返すというPerlの機能により、変数のデフォルト値を設定するためによく使用されます。問題は、 | =
が bitwise であるか、 || =
が logical または。
Perl 5.10以降では、代わりに // =
を使用することをお勧めします。 //
は論理的なOR演算子であり、現在の値が定義されているがfalseである場合には失敗しません。
問題は" | =
"を使用していたと思います。 (ビット単位のOR代入)の代わりに" || =
" (falseの場合は割り当て)。
新しいコードはまったく同じではないことに注意してください。違いは、" $ myhash {$ key} || = {}
"既存の偽の値をハッシュ参照に置き換えますが、新しい値は置き換えません。実際には、これはおそらく関係ありません。
これを試してください:
my %myhash;
$myhash{$key} ||= {};
私の知る限り、 my
句ではハッシュ element を宣言できません。まずハッシュを宣言してから、要素を追加します。
編集: my
を取り出しました。 | =
の代わりに || =
を試してみてください。前者は「怠laz」のイディオムです。初期化。