我只是想知道这段代码会发生什么。为什么仅直接打印时结果不正确,为什么换行符被忽略?
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
Run Code Online (Sandbox Code Playgroud)
    Perl将括号解释为函数参数标记,您可以使用
perl -MO=Deparse,-p -e 'print (2 & 2) >> 1'
Run Code Online (Sandbox Code Playgroud)
输出:
(print(2) >> 1);
Run Code Online (Sandbox Code Playgroud)
规范的方法是在左括号前面加上+:
print +(2 & 2) >> 1
Run Code Online (Sandbox Code Playgroud)
        当您打印带有警告的内容时,它会变得清晰(er)
perl -we'print (2 & 2), "\n"'
Run Code Online (Sandbox Code Playgroud)
说
在-e第1行将print(...)解释为功能。 在-e第1行的无效上下文中无用的使用常量(\ n)。
它print(2&2)作为对print†的函数调用工作,并正确打印2(不换行!),然后继续评估逗号运算符,"\n"其次是在无效上下文中,对此警告我们。  
随着>> 1也在那里,返回1的print(2&2)(成功)是位转向0,其消失在虚空中,我们得到另一个“ 在无效的情况下没用使用的......。”
一种解决方法是添加一个,+因为其后必须是一个表达式
perl -we'print +(2 & 2) >> 1, "\n"'
Run Code Online (Sandbox Code Playgroud)
或者,对进行适当的调用print,并在整个内容中加上括号
perl -we'print((2 & 2) >> 1, "\n")'
Run Code Online (Sandbox Code Playgroud)
都用打印一行1。
这在印刷版中有所提及,并且在perlop中的术语和列表运算符以及符号一元运算符中都有更全面的记录。
† 它还警告您,因为在列表尾随它可能是一个错误