在perl中将数字视为数字的最简单方法?

Dal*_*ter 5 perl

我有一个条件:

next if ( ! ($x or $y or $z) );
Run Code Online (Sandbox Code Playgroud)

检查的逻辑是至少有一个必须在数值上非零才能在循环中继续.

我相信他们实际上是数字.

问题是perl将float作为字符串存储在内部.所以在检查! $x那里$x='0.00'实际上并不评估为true:my $x = 0.00; if ( ! $x ) { never_gets_here(); }

在不使行过于冗长的情况下强制对变量进行数值求值的最简单方法是什么?

fri*_*edo 10

我不确定你在哪里知道Perl将浮动存储为字符串.浮点数和字符串是不同的东西:

perl -le 'print 1 if 0.00'
perl -le 'print 2 if "0.00"'
2
Run Code Online (Sandbox Code Playgroud)

如果要在未知标量上强制数字上下文,则可以向其添加零,例如

unless ( $x + 0 ) { ... }
Run Code Online (Sandbox Code Playgroud)

  • @Dale Forester - 为了更深入地了解Perl的内部结构,尝试`perl -e'使用Devel :: Peek;转储($ _)为(0,0.0,"0")'` (5认同)
  • @Dale,Data :: Dumper在序列化Perl数据类型时不是很聪明.它会将每个标量都视为一个字符串,因为你必须偷看Perl内部来识别"真实"类型,它可以并且会自行改变,甚至可以同时进行两件事!(这就是为什么你不应该依赖Perl中的真实类型信息.) (2认同)

mob*_*mob 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
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果$ x == 0和$ y == 0和$ z == 0`则为`next (3认同)