Scalar::Util的looks_like_number函数返回数字类型

9

我注意到looks_like_number并不像我以为的那样简单地返回true/false,而实际上返回一个字节,表示Perl内部说存储在标量中的数字类型。例如:

perl  -e'use Scalar::Util qw/looks_like_number/; for (qw/ 1 3 10 34.23 545435.234 2343.0 234 -1423 1sddf -865178652134876152348761253487613254 sdf 24363456345636534563567253765734655  8764325hjkh435 iuh340874 &*^*& 786521948761324876132497821347816.23452345 -8762135487126387432.12435154243 0 nan inf/) { print $_, ": ", looks_like_number($_), "\n" } '
1: 1
3: 1
10: 1
34.23: 5
545435.234: 5
2343.0: 5
234: 1
-1423: 9
1sddf: 0
-865178652134876152348761253487613254: 10
sdf: 0
24363456345636534563567253765734655: 2
8764325hjkh435: 0
iuh340874: 0
&*^*&: 0
786521948761324876132497821347816.23452345: 6
-8762135487126387432.12435154243: 14
0: 1
nan: 36
inf: 20

我在Scalar::Util文档中并没有找到相关记录,只是提到了它返回perlapi的looks_like_number值,而后者也没有在文档中。乍一看,它似乎是这样的:
  • & 1 = 数字
  • & 2 = 64位
  • & 4 = 浮点数
  • & 8 = 负数
  • & 16 = 无穷大
  • & 32 = 非数字
这些掩码在代码中使用是否安全?

就其价值而言,自5.8以来,至少在Linux 32位上的所有稳定Perl版本中,“looks_like_number()”似乎对您的样本输入返回相同的值。当然,对于您的问题,谨慎的答案仍然是“不”。 - pilcrow
从 Scalar::Util 1.39 开始,这个已经被改变了,looks_like_number 总是返回 PL_yes 或者 PL_no(即 !!1 或者 !!0)。 - tobyink
2个回答

5
不行,如果它们没有记录,那么它们就可能会改变。"numeric"和"64位"并不能很好地描述这些标志。在Perl代码中了解它们的实际作用似乎并没有什么用处。
你试图解决什么问题?

是的,从我对C语言的模糊记忆来看,real或big可能更好。我正在尝试将输入验证为int,并且可能会进行过早的优化,而不是直接运行它以匹配/^\d+$/。 - Oesor
也许你的意思是 [0-9]+(或在5.14+中使用 /a 修饰符) - ysth
这就是为什么我一开始在寻找非正则表达式的原因 :P。 - Oesor

1
不要依赖未记录的行为,返回值绑定到Perl的内部,它可能会(而且很可能)在未来发生变化;甚至根据脚本运行的平台/架构可能会有所不同!
如果您想测试NaN、无穷大或负零,请参阅this question

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接