我只是想知道这段代码会发生什么。 为什么仅直接打印时结果不正确,为什么换行符会被忽略?
user@host_09:22 AM: perl
print 2 >> 1, "\n";
print 2 & 2, "\n";
print (2 & 2) >> 1, "\n";
1
2
2user@host_09:22 AM: perl
$a = (2 & 2) >> 1;
print "$a\n";
1
答案 0 :(得分:6)
Perl将括号解释为函数参数标记,您可以使用
进行验证perl -MO=Deparse,-p -e 'print (2 & 2) >> 1'
输出:
(print(2) >> 1);
规范的方法是在左括号之前加上+
:
print +(2 & 2) >> 1
答案 1 :(得分:4)
在打印带有警告的内容时,它会变得很清晰
perl -we'print (2 & 2), "\n"'
说
print (...) interpreted as function at -e line 1. Useless use of a constant ("\n") in void context at -e line 1.
它将print(2&2)
作为对print
的函数调用,打印出2,然后继续评估comma operator,接下来在空白上下文中"\n"
,这它警告我们。
在>> 1
也存在的情况下,1
的返回print(2&2)
(成功)被移至0
,它消失在空白中,我们得到
另一个“ 在无效上下文中无用的... 。”
一种解决方法是添加一个+
,以使解释器知道(
用于表达式。
perl -we'print +(2 & 2) >> 1, "\n"'
或者,适当地调用print
,并在整个内容中加上括号
perl -we'print((2 & 2) >> 1, "\n")'
都用1
打印一行。
这在print中有所提及,在Terms and List operators和Symbolic Unary operators中,都在perlop中有更完整的记录。