为什么perl会得到一个“;“真的”;对于这个if语句
我是perl新手,最近发现了一个无法解决的问题 这是我的密码为什么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
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
在我和另外两个一起玩的时候总是设置为非零)。这就是我的第二段所指的,我想我实际上可以重现他的怪异效果。