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) 调用函数。该函数应该返回一个 hashref,其中键和值都是foo字符串。之后,它打印返回的 hashref 的 key 的值foo,即foo.

到目前为止,一切都很好。没用,但还是很有趣。奇怪的是,当我删除1 &&sub 中的部分时,尽管有卷曲,它仍会返回一个列表,我不知道为什么会这样做。

如果我只是说它sub foo { { 'foo'=>'foo' } }返回参考。为什么在我的情况下没有?此外,为什么在我添加时会出现1 &&

4

1 回答 1

6

如果没有该1 &&部分,花括号将被解释为一个块,从而返回一个列表。通过附加部分,perl 解释器根据需要创建匿名哈希引用。

1 &&你也可以使用简单+的 perl 解释器来代替:

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