在perl中将数字视为数字的最简单方法?
我有一个条件:在perl中将数字视为数字的最简单方法?,perl,Perl,我有一个条件: next if ( ! ($x or $y or $z) ); 检查的逻辑是,至少一个必须在数值上非零,才能在循环中继续 我相信它们实际上是数字 问题是perl在内部将浮动存储为字符串。因此,请查看$x其中$x='0.00'的计算结果实际上不是真的:my$x=0.00if(!$x){never_get_here();} 在不使行过于冗长的情况下,强制对变量进行数值计算的最简单方法是什么?要检查数字是否为非零值,只需添加0: $ perl -e "print '0.02' + 0
next if ( ! ($x or $y or $z) );
检查的逻辑是,至少一个必须在数值上非零,才能在循环中继续
我相信它们实际上是数字
问题是perl在内部将浮动存储为字符串。因此,请查看
$x
其中$x='0.00'
的计算结果实际上不是真的:my$x=0.00
if(!$x){never_get_here();}
在不使行过于冗长的情况下,强制对变量进行数值计算的最简单方法是什么?要检查数字是否为非零值,只需添加0:
$ perl -e "print '0.02' + 0;"
0.02
及
这是Perl中的falsy值:
$ perl -e "print (('0.00' + 0) ? 'true' : 'false');"
false
我不确定您是从哪里得到Perl将浮动存储为字符串的想法的。浮动和字符串是不同的东西:
perl -le 'print 1 if 0.00'
perl -le 'print 2 if "0.00"'
2
如果你想在一个未知的标量上强制数字上下文,你可以在它上面加零,例如
unless ( $x + 0 ) { ... }
将零(0)添加到变量中(就像在“awk”中一样)。如果要检查数字是否在数字上非零,则有一个运算符:
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
如果不存在(或仅存在)负值,则可以使用以下快捷方式,这比在每个值上加零要干净得多:
next if ( $x + $y + $z == 0 );
在比较中转换它:
next如果(0+$x或0+$y或0+$z)
BTW:my$x=0.00;如果(!$x){print$x}
按预期工作,“perl在内部将浮动存储为字符串。”这不是真的。@ikegami:他的意思可能是my$x='0.00';如果(!$x){print$x}
。这不会以新手所期望的方式起作用。@橡胶靴,当然不会。但这并不能证明Perl将浮动存储为字符串。这是一个用户将十进制数存储为字符串的示例。Perl以双精度浮点数(或更大的浮点数)存储十进制数。相对于字符串,重新浮点数时,我看到了什么;使用警告;使用数据::转储程序;我的$x=0;打印转储程序($x),“\n”vsperl-e'使用严格;使用警告;使用数据::转储程序;我的$x=0.00;打印转储程序($x),“\n”代码>?Thanks@DaleForester—要更深入地了解Perl的内部结构,请尝试使用Devel::Peek;Dump($)for(0,0.0,“0”)
@Dale,Data::Dumper在序列化Perl数据类型时不是很聪明。它将把每个标量视为一个字符串,因为您必须查看Perl的内部结构才能识别“真实”类型,它可以并且将改变自身,甚至可以同时是两件事!(这就是为什么不应该依赖Perl中的实类型信息。)或者,如果$x==0和$y==0和$z==0,则下一步是
next if ( $x + $y + $z == 0 );