我遇到了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?"
。
是什么给出了?
答案 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 strict
和use 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“为什么不呢?”};
在这里工作,你忘记了$,但是你已经发现了它:)