检查数字是否为int或float

Alp*_*neo 6 perl types

在perl中,我想检查给定变量是否保持浮点数不是.为了检查我正在使用,

my $Var = 0.02 # Floating point number

if (int($Var) != $Var) {

   # floating point number
}
Run Code Online (Sandbox Code Playgroud)

但上面的代码不适用于0.0,

我怎样才能做到这一点?

Sin*_*nür 15

这是一个FAQ.请参阅如何确定标量是否为数字/整数/整数/浮点数?

您也可以使用Scalar :: Util :: Numeric.

有趣的是,虽然

#!/usr/bin/perl

use strict; use warnings;
use Scalar::Util::Numeric qw(isint);

my $x = 0.0;
print "int\n" if isint $x;
Run Code Online (Sandbox Code Playgroud)

打印int(如果你看看源代码并不奇怪),基于@ tchrist的评论,应该可以看的变量结构来区分所提供的信息0来自0.0:

#!/usr/bin/perl

use strict; use warnings;
use Devel::Peek;

my $x  = 0.0; print Dump $x;
my $y  = 0;   print Dump $y;
   $y *= 1.1; print Dump $y;
Run Code Online (Sandbox Code Playgroud)

输出:

SV = NV(0x18683cc) at 0x182c0fc
  REFCNT = 1
  FLAGS = (PADMY,NOK,pNOK)
  NV = 0
SV = IV(0x182c198) at 0x182c19c
  REFCNT = 1
  FLAGS = (PADMY,IOK,pIOK)
  IV = 0
SV = PVNV(0x397ac) at 0x182c19c
  REFCNT = 1
  FLAGS = (PADMY,NOK,pNOK)
  IV = 0
  NV = 0
  PV = 0

在我看来,检查只需要看看是否NOK设置了标志.即使是最简单的XS也需要很长时间才能编写,因此我不会提供实现.


小智 7

($Var - int($Var))?'float':'int'
Run Code Online (Sandbox Code Playgroud)

  • 警告:这会将字符串称为“ int”。它可以验证数字,但不能保证$ Var实际上是数字。 (2认同)