perl 在void上下文中无用地使用(/)

pu82cl6c  于 2022-12-13  发布在  Perl
关注(0)|答案(2)|浏览(142)

当我尝试此代码时:

use strict;
use warnings;
print (44+66)/2;

它给了我:

在www.example.com第3行的void上下文中无用地使用了除法(/)p.pl。

但是,经过几次尝试,它通过在表达式周围添加额外的外部括号来工作,如:

use strict;
use warnings;
print ((44+66)/2);

而且它确实起作用了!
谁能解释一下为什么?

bvjveswy

bvjveswy1#

使用Deparse将给予有关perl如何解析代码的更多信息:

perl -MO=Deparse p.pl
Useless use of division (/) in void context at p.pl line 3.
use warnings;
use strict;
print(110) / 2;
p.pl syntax OK

在这里,您可以看到括号中的表达式按预期进行了计算(66+44 = 110)。但是,perl将110作为输入传递给print,然后尝试将print的输出除以2。
另一个有用的工具是diagnostics

perl -Mdiagnostics p.pl
Useless use of division (/) in void context at p.pl line 3 (#1)
    (W void) You did something without a side effect in a context that does
    nothing with the return value, such as a statement that doesn't return a
    value from a block, or the left side of a scalar comma operator.  Very
    often this points not to stupidity on your part, but a failure of Perl
    to parse your program the way you thought it would.

启用warnings非常好,因为它提醒您代码可能有问题。当我们运行代码时,得到的输出是110,而您期望的是55。

nhn9ugyo

nhn9ugyo2#

函数名和函数调用的左括号之间的空格是可选的。所以当你写:

print (44+66)/2;
#    ^ optional space!

Perl假设您想用print(44+66)除以2,然后忽略结果,所以Perl警告您不要执行不必要的除法操作。

# workaround
print( (44+66)/2 );

# other workaround
print +(44+66)/2;

相关问题