2011-02-18 38 views
4

請你能不能解釋一下這個* *顯然不一致的行爲對我說:明顯的陌生感

use strict; 
sub a { 2 + 2 }; 
print 2 * a(); # this prints: 8 
print a() * 2; # this prints: 8 
print 2 * a; # this prints: 8 
print a * 2; # this prints: 4 

感謝的答案,都非常有幫助 - 我學到了很多東西。

回答

6

在最後一個例子,表達被解析爲a(*2)與水珠參數*2如果你想a被解析爲這是包變量*main::2

的短名字叫a一個不需要參數的函數,你需要聲明如下:

sub a() {2 + 2} 

然後perl會解析你所期望的語句。事實上,如果你這樣寫,Perl會檢測到它是一個常量函數,並且將在調用a的每個地方內聯4

+0

哦,這就像JavaScript不接受函數{...它必須是函數a(){...正如我發現當我去這裏:http://www.w3schools.com/jsref /tryit.asp?filename=tryjsref_onblur。所以* 2或* main :: 2是連接到反向引用標量$ 2的glob? – Literat 2011-02-18 17:46:40

12

Deparse表明您傳遞一個水珠的在最後一節:

$ perl -MO=Deparse,-p 
use strict; 
sub a { 2 + 2 }; 
print 2 * a(); # this prints: 8 
print a() * 2; # this prints: 8 
print 2 * a; # this prints: 8 
print a * 2; # this prints: 4 
__END__ 
sub a { 
    use strict 'refs'; 
    4; 
} 
use strict 'refs'; 
print((2 * a())); 
print((a() * 2)); 
print((2 * a())); 
print(a(*2)); 

您使用子程序調用的括號是件好事......