浏览模式: 标准 | 列表

在某些情况下,我们需要判断一个标量是否为数字类型,而不仅仅是这个标量是否看上去像个数字,例如:

Perl代码
 
  1. my $val = 123;  
$val 是一个数字,而

Perl代码
 
  1. my $val = "123";  
这个 $val 只是像一个数字。

虽然大部分情况下我们不需要对它们区分的这么清楚,但是总会遇到不得不区分它们的情况,例如当你对它进行序列化操作时,如果只是按照像数字来进行判断,序列化之后的结果则不够准确。当然需要区分它们的情况还有很多,我们这里不做列举。我们下面重点来讲一下怎么区分它们。

在 Perl 5.14 之后的版本中,我们可以通过 & 运算符来做区分:

Perl代码
 
  1. sub isnumeric {  
  2.     my $val = shift;  
  3.     return lengthdo { no warnings "numeric"$val & "" } ) > 0;  
  4. }  
这段代码在 5.14 及其之后的版本上工作的很好,但是在 5.14 之前的版本上它返回的结果却是错误的。

经过各种尝试之后,我们最后终于找到了一种更加简单且在各个版本上都有效的测试方式:

Perl代码
 
  1. sub isnumeric {  
  2.     my $val = shift;  
  3.     ($val ^ $val) eq '0';  
  4. }  
原理是字符串做^运算,结果为空字符串,数字做^运算,结果为0。