为什么perl会得到一个“;“真的”;对于这个if语句

为什么perl会得到一个“;“真的”;对于这个if语句,perl,if-statement,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

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

您应该将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 ;

您应将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 ;

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

但是,这并不能回答当
$a
$b
为0时为什么不起作用的问题。我很确定这与
$a
$b
是特殊变量有关(例如在
排序
中使用)。如果您使用了其他变量名,例如
(0,0,0)=($var1,$var2,$c)
,那么
$var1
$var2
的内容实际上并不重要


在这种情况下,
使用警告
会给您一个线索:
在无效上下文中无用地使用私有变量
。这是指
$var1
$var2
都是列表的一部分,但不是该列表的最后一个元素,因此它们的值在语句中根本不重要。

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

但是,这并不能回答当
$a
$b
为0时为什么不起作用的问题。我很确定这与
$a
$b
是特殊变量有关(例如在
排序
中使用)。如果您使用了其他变量名,例如
(0,0,0)=($var1,$var2,$c)
,那么
$var1
$var2
的内容实际上并不重要


在这种情况下,
使用警告
会给您一个线索:
在无效上下文中无用地使用私有变量
。这是指
$var1
$var2
都是列表的一部分,但不是该列表的最后一个元素,因此它们的值在语句中根本不重要。

您是否尝试过
使用严格的
使用警告
?是的,我尝试过,但仍然是相同的事情,您没有得到警告吗“在void上下文中无用地使用私有变量”?你的代码只在
if($c==0)
中使用了
use strict
use warnings
吗?是的,我做了,但仍然是一样的,你没有得到关于“在void上下文中无用地使用私有变量”的警告吗?同样,你的代码只在
if($c==0)中使用私有变量
感谢您的回复。我在代码请求时为true和false语句定义了两个常量,使用常量{true=>1,false=>0};由于perl有不止一个“假”值和很多“真”值,设置常量可能会让你养成坏习惯。与其测试
$x==true
$x==false
测试
$x
!$x
。在这里同意@tjd。
返回@x~@zero;
就足够感谢你的回答了。我定义了2代码请求时true和false语句的常量使用常量{true=>1,false=>0};由于perl有不止一个“假”值和很多“真”值,设置常量可能会让你养成坏习惯。与其测试
$x==true
$x==false
测试
$x
!$x
。在这里同意@tjd。
返回@x~~@zero;
就足够了包装变量$a和$b是特殊的i这完全不相关。事实上,他使用的词汇$a和$b并不特殊。如果$c为0,则返回true,如果$c不为零,则返回false。如果返回false,则是因为$c不是零,而不是因为他使用了$a和$b。左边的列表
($a,$b,$c)
是在标量上下文中计算的,所以它就变成了
$c
。我知道。当我尝试将
$a
$b
设置为零的原始示例时,结果确实总是错误的——或者我是这么认为的。当然,我不能再复制它了,所以我猜我是在对它进行成像(或者,
$c
在我和另外两个一起玩时总是设置为非零)这就是我第二段提到的,我认为我可以复制他的奇怪效果。包变量$a和$b是特殊的完全不相关。事实上,他使用的词汇$a和$b并不特殊。如果$c为0,则返回true,如果$c不为零,则返回false。如果返回false,则是因为$c不是零,而不是因为他使用了$a和$b。左边的列表
($a,$b,$c)
是在标量上下文中计算的,所以它变成了
$c
。我知道。当我尝试将
$a
$b
设置为零的原始示例时,结果确实总是错误的——或者我是这么认为的。当然,我不能再复制它了,所以我想我是在想象它(或者,
$c
在我和另外两个一起玩的时候总是设置为非零)。这就是我的第二段所指的,我想我实际上可以重现他的怪异效果。