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)
感谢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";并简单地抛弃换行而不是打印它.