2

理解できない奇妙な振る舞いに遭遇したとき、私は何も役に立たない難読化されたコードをいじっていました。

これが私のコードです。

no strict;
sub foo{1&&{${$_[0]},${$_[0]}}}say map {&${${_}}(${_})->{${${_}}}}map{\$_}qw(foo);

そしてインデントされています:

no strict;
sub foo {
  1 && { ${$_[0]} => ${$_[0]} }
}
say map { &${ ${_} }( ${_} )->{ ${ ${_} } } }
  map { \$_ } qw (foo);

文字列を取得し、その文字列fooへの参照を作成してから、その名前(&foo)で関数を呼び出す必要があります。その関数は、キーと値の両方がfoo文字列であるハッシュ参照を返す必要があります。その後、返されたhashrefのキーの値であるfoo。を出力しますfoo

ここまでは順調ですね。役に立たないが、それでも楽しい。奇妙なことに、サブのパーツを削除する1 &&と、カーリーにもかかわらずリストが返されますが、なぜそうなるのかわかりません。

私が言うならsub foo { { 'foo'=>'foo' } }、それは参照を返します。私の場合、なぜそうではないのですか?さらに、追加するとなぜ1 &&ですか?

4

1 に答える 1

6

部分がない1 &&場合、中括弧はブロックとして解釈されるため、リストが返されます。追加の部分で、perlインタープリターは必要に応じて匿名のハッシュ参照を作成します。

代わりに、perlインタープリターを支援するため1 &&に単純なものを使用することもできます。+

sub foo {
  +{ ${$_[0]} => ${$_[0]} }
}
于 2012-05-23T13:27:31.663 に答える