Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中将数字视为数字的最简单方法?_Perl - Fatal编程技术网

在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”vs
perl-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 );