Perl:从函数返回hashref不起作用

时间:2012-05-23 13:25:04

标签: perl function obfuscation hashref

当我遇到一些我不理解的奇怪行为时,我一直在使用一些模糊的代码,这些代码没有任何用处。

这是我的代码。

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,其中key和value都是foo字符串。之后,它会打印返回的hashref的键foo的值,即foo

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

如果我只说sub foo { { 'foo'=>'foo' } },它会返回引用。为什么不在我的情况下呢?此外,为什么我添加1 &&

1 个答案:

答案 0 :(得分:6)

如果没有1 &&部分,花括号将被解释为一个块,从而返回一个列表。使用附加部分,perl解释器根据需要进行匿名散列引用。

您可以使用简单的1 &&代替+来帮助perl解释器:

sub foo {
  +{ ${$_[0]} => ${$_[0]} }
}