我是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,谁可以为我解决这个问题?
答案 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 ;