質問

私はハッシュ参照を使用する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」のイディオムです。初期化。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top