0

我是 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,谁能帮我解决这个问题?

4

2 回答 2

4

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

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

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

于 2013-04-15T19:40:19.083 回答
1

您应该将 if 条件更改为:

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

Perl 中没有“真”和“假”的特殊词。如果您有 perl 5.10+,这可能会帮助您:

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

return ( @x ~~ @zeros ) ? 1 : 0 ;
于 2013-04-15T19:33:53.020 回答