为什么'print(52-80)*42'与Perl中的'print 42*(52-80)'不同?

Ant*_*ony 3 printing math perl operators

Perl ::什么是:

1. (52-80)*42
2. 42*(52-80)
Run Code Online (Sandbox Code Playgroud)

答:

1. -28
2. -1176
Run Code Online (Sandbox Code Playgroud)

为什么?

请乐趣解释/证明这一点!

#!/usr/bin/perl
use strict;
print 42*(52-80) , "\n";
print ((52-80)*42) , "\n";
print (52-80)*42 , "\n";
print "\n";
my $i=(52-80)*42;
print $i, "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

> -1176
> -1176-28
> -1176
Run Code Online (Sandbox Code Playgroud)

Ale*_*sky 24

如果你添加use warnings;你将获得:

print (...) interpreted as function at ./test.pl line 5.
Useless use of a constant in void context at ./test.pl line 5
Run Code Online (Sandbox Code Playgroud)


mob*_*mob 17

Alex Howansky的警告意味着这一点

print (52-80)*42 , "\n"
Run Code Online (Sandbox Code Playgroud)

被解析为

(print(52-80)) * 42, "\n"
Run Code Online (Sandbox Code Playgroud)

也就是说,包含(1)42次函数结果的列表print(-28),以及(2)包含换行符的字符串.(1)的副作用是将值-28(不带换行符)打印到标准输出.

如果需要打印以括号开头的表达式,则解决方法是在其前面添加+:

print +(52-80)*42, "\n"         #  ==> -1176
Run Code Online (Sandbox Code Playgroud)

  • 或者如果您不确定如何解释它们,请不要使用隐式括号.记住,伙计们,这种速记不是强制性的. (4认同)

Joh*_*ica 6

感谢Perl古怪的解析规则(哦,Perl,你好!),这些陈述:

print ((52-80)*42) , "\n";
print (52-80)*42 , "\n";
Run Code Online (Sandbox Code Playgroud)

被解释为好像是他们写的:

(print ((52-80)*42)), "\n";
(print (52-80))*42, "\n";
Run Code Online (Sandbox Code Playgroud)

这就是为什么你最终看到-1176-28一行,并且缺少预期的空白行.Perl看到(print-expr), "\n";并简单地抛弃换行而不是打印它.

  • 在其他情况下,任何其他选择都是古怪的.除非你真正抱怨所有论点都应该总是要求括号? (5认同)