当我遇到一些我不理解的奇怪行为时,我一直在使用一些模糊的代码,这些代码没有任何用处。
这是我的代码。
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 &&
?
答案 0 :(得分:6)
如果没有1 &&
部分,花括号将被解释为一个块,从而返回一个列表。使用附加部分,perl解释器根据需要进行匿名散列引用。
您可以使用简单的1 &&
代替+
来帮助perl解释器:
sub foo {
+{ ${$_[0]} => ${$_[0]} }
}