2012-05-23 38 views
1

我当时遇到了一些混淆的代码,它在我遇到一些我不明白的奇怪行为时并没有做任何有用的事情。Perl:从函数返回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

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

如果我只是说sub foo { { 'foo'=>'foo' } }它返回参考。为什么不在我的情况?此外,为什么当我添加1 &&

+1

我爱怎么perl的“可读”还在,或多或少不可读:) – asf107

+0

这就是痛苦的Perl。当它适合一条线时,几乎没有任何借口。如果你使用多行,它应该是为了清晰起见而写的,而不是这样(除非有一些解释性的评论不存在)。 –

+2

@ asf107他的意思是“缩进”,而不是“可读”。普通的Perl代码是完全可读的,尽管一些由开心的业余爱好者编写的代码看起来像是一团糟。 – TLP

回答

5

没有1 &&部分,花括号被解释为一个块,因此返回一个列表。通过额外的部分,perl解释器根据需要创建匿名哈希引用。

取而代之的1 &&你也可以使用一个简单的+帮助Perl解释:

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

此外,一个明确的'return {...};'会工作,我相信(这更清晰)。 –

+0

@JonathanLeffler确定显式返回将是最好的解决方案,但是因为帖子被标记为混淆...;) – dgw

+0

它确实存在,但我忘记了这一点.dgw的答案解释了发生了什么。我不会想到它会被视为一个块。如果你仔细想想,这很有意义。感谢那。 – simbabque