2

我遇到了 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?".

是什么赋予了?

4

3 回答 3

10

正如 Rohit 回答的那样,解决方案是$b. 它不打印"Why not?"但打印"WTF" 的确切原因是这样的:当您给出b不带$符号的 ( 并且没有use strict;生效的) 时,Perl 将 theb视为字符串"b"。然后当您在其上应用运算符%时,因为%是数字运算符, Perl 在字符串中查找"b"并检查它是否以数字开头。既然不是,Perl 将数值"b"作为 0,然后应用 mod (%) 操作。0%5 是 0 而不是 2,所以WTF是打印而不是"Why not?"

于 2012-11-24T11:44:14.517 回答
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?"};

给出预期的结果。

于 2012-11-24T11:31:19.090 回答
2

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

在这里工作,你忘记了 $,但显然你已经找到了它:)

于 2012-11-24T11:33:44.823 回答