为什么 perl 会为此获得 if 语句"true"



我是perl的新手,最近发现了一个我无法解决的问题。

我的代码

my ($a, $b, $c);
$a = 1.11;
$b = 2.22;
$c = 0;
if ( (0, 0, 0) == ($a, $b, $c))
{
    return true;
}
else
{
    return false;
}

结果看起来很有趣。如果我赋值$c = 0(而$a和$b不等于0),则此If语句返回true,但我试图将$a或$b设置为0,则此语句返回false。

这个语句的目的是检查是否所有的$a, $b, $c都是零,但似乎只要$c = 0,它就返回真,谁能帮我解决这个问题?

==强制标量上下文。标量上下文中的列表(不要与数组混淆!)是它的最后一个元素。因此,您有效地比较了0 == $c,当且仅当$c本身为0时为真。

然而,这并没有回答为什么当$a$b为0时这不起作用的问题。我很确定它与$a$b是特殊变量有关(它们在sort中使用)。如果您使用其他变量名,例如(0, 0, 0) == ($var1, $var2, $c),那么$var1$var2的内容确实无关紧要。

在这种情况下use warnings会给你一个线索:Useless use of private variable in void context。这是指$var1$var2都是列表的一部分,但不是该列表的最后一个元素,因此它们的值在语句中根本不重要。

您应该将if条件更改为:

return ( ($a == 0) and ($b == 0) and ($c == 0) ) ? 1 : 0;

在Perl中没有"真"one_answers"假"的特殊单词。如果您使用的是perl 5.10+,这可能会对您有所帮助:

my @x = qw(1 0 0);
my @zeros = qw(0 0 0);
return ( @x ~~ @zeros ) ? 1 : 0 ;

最新更新