理解できない奇妙な振る舞いに遭遇したとき、私は何も役に立たない難読化されたコードをいじっていました。
これが私のコードです。
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 &&
ですか?