为什么perl会为这个if语句获得“true”

时间:2013-04-15 19:26:29

标签: perl if-statement

我是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时,它返回true,谁可以为我解决这个问题?

2 个答案:

答案 0 :(得分:4)

==强制标量上下文。标量上下文中的列表(不要与数组混淆!)是它的最后一个元素。因此,您有效地比较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都是列表的一部分但不是该列表的最后一个元素的事实,因此它们的值在语句中根本不重要。

答案 1 :(得分:1)

您应该将if条件更改为:

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

Perl中没有“true”和“false”特殊词。 如果您有perl 5.10+,这可能会对您有所帮助:

my @x = qw(1 0 0);
my @zeros = qw(0 0 0);

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