我遇到了 Perl 短路的奇怪结果,即&&
.
我正在尝试解决 Project 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?"
.
是什么赋予了?
我遇到了 Perl 短路的奇怪结果,即&&
.
我正在尝试解决 Project 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?"
.
是什么赋予了?
正如 Rohit 回答的那样,解决方案是$
在b
. 它不打印"Why not?"
但打印"WTF
" 的确切原因是这样的:当您给出b
不带$
符号的 ( 并且没有use strict;
生效的) 时,Perl 将 theb
视为字符串"b"
。然后当您在其上应用运算符%
时,因为%
是数字运算符, Perl 在字符串中查找"b"
并检查它是否以数字开头。既然不是,Perl 将数值"b"
作为 0,然后应用 mod (%) 操作。0%5 是 0 而不是 2,所以WTF
是打印而不是"Why not?"
始终使用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?"};
给出预期的结果。
if($b%21==0 && $b%2==0 && $b%5==2){print "为什么不呢?"};
在这里工作,你忘记了 $,但显然你已经找到了它:)