我有条件:
next if ( ! ($x or $y or $z) );
检查的逻辑是,至少有一个必须在数字上非零才能继续循环。
我相信他们实际上是数字。
问题是perl在内部将浮点数存储为字符串。因此,检查! $x
$x='0.00'
实际上未评估为真的my $x = 0.00;
if ( ! $x ) { never_gets_here(); }
在不使行过于冗长的情况下强制对变量进行数值求值的最简单方法是什么?
答案 0 :(得分:10)
我不确定你在哪里知道Perl将浮动存储为字符串。浮点数和字符串是不同的东西:
perl -le 'print 1 if 0.00'
perl -le 'print 2 if "0.00"'
2
如果要在未知标量上强制使用数字上下文,则只需向其添加零,例如
unless ( $x + 0 ) { ... }
答案 1 :(得分:8)
如果你想检查一个数字是否在数字上非零,那么就有一个算子:
next if (! ($x != 0 or $y != 0 or $z != 0) )
$x bool $x $x != 0
-------- -------- ----------------------------
0 false false
'0.00' true false
'0E0' true false
'string' true false, generates 'non-numeric' warning
'' false false, generates 'non-numeric' warning
undef false false, generates 'non-numeric' warning
答案 2 :(得分:4)
要检查数字是否具有非零值,您只需添加0:
$ perl -e "print '0.02' + 0;"
0.02
和
$ perl -e "print '0.00' + 0;"
0
这是Perl中的虚假值:
$ perl -e "print (('0.00' + 0) ? 'true' : 'false');"
false
答案 3 :(得分:2)
将零(0)添加到变量中(就像在' awk'中一样)。
答案 4 :(得分:0)
如果没有(或排他地)负值,您可以使用以下快捷方式,这比为每个单独的值添加零更清晰:
next if ( $x + $y + $z == 0 );