短路并给出不正确的结果?

时间:2012-11-24 11:28:29

标签: perl short-circuiting operation

我遇到了Perl短路的奇怪结果,那就是&&

我正在尝试解决项目Euler问题,我希望某个数字可以被数字列表整除。

$b=42;

if($b%21==0 && b%2==0 && b%5==2){print "Why not?"};

应该尽可能打印"Why not",但要保持沉默。

$b=42;

if($b%21==0 && b%2==0 && b%5==0){print "WTF?"};

应保持沉默,但打印"WTF?"

是什么给出了?

3 个答案:

答案 0 :(得分:10)

正如Rohit所说,解决方案是在$之前添加b。它不打印"Why not?"但打印"WTF“的确切原因是:当您b没有$符号(并且没有use strict;时) force),Perl将b视为字符串"b"。然后当您在其上应用运算符%时,由于%是一个数值运算符,Perl会在字符串中查找"b"并检查它是否以数字开头。由于它没有,Perl将"b"的数值取为0,然后应用mod(%)运算.0%5为0且不是2,因此打印WTF而不是"Why not?"

答案 1 :(得分:8)

始终使用use strictuse warnings

您使用的是最后两个b's作为裸字,它将显示为警告 - "Unquoted string "b" may clash with future reserved word"

您需要将if更改为: -

if($b%21==0 && $b%2==0 && $b%5==2){print "Why not?"};

和: -

if($b%21==0 && $b%2==0 && $b%5==0){print "WTF?"};

给出了预期的结果。

答案 2 :(得分:2)

if($ b%21 == 0&& $ b%2 == 0&& $ b%5 == 2){print“为什么不呢?”};

在这里工作,你忘记了$,但是你已经发现了它:)