请你解释一下*显然*不一致的行为给我:
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
感谢您的回答,非常有帮助 - 我学到了很多东西。
答案 0 :(得分:12)
Deparse透露你正在将一个glob传递给最后一个:
$ 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));
在子程序调用中使用parens是一件好事......
答案 1 :(得分:6)
在最后一个示例中,表达式被解析为a(*2)
,它使用glob参数a
调用*2
,这是包变量*main::2
的短名称
如果希望将a
解析为不带参数的函数,则需要将其声明为:
sub a () {2 + 2}
然后perl将按预期解析语句。实际上,如果你这样写,perl会检测到它是一个常量函数,并且会在4
被调用的每个地方内联a
。