2012-05-23 39 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