Perl中Scalar :: Util :: Looks_like_number的行为

时间:2013-10-05 18:28:46

标签: perl

我试图找出输入是数字还是字符串。我遇到了looks_like_number,无法理解它返回的值。

use warnings;
use Scalar::Util qw(looks_like_number);

my $name = 11;
print looks_like_number ($name);

如果1包含字符串,则此代码打印$name,如果$name包含整数(即每个整数为4352),则此代码打印静态编号。

我在Windows上使用Perl。

3 个答案:

答案 0 :(得分:17)

你忘了提问了!这有两种可能性。

为什么它总是返回相同的true值?

为什么不呢?它返回一个记录的真值。它没有区别真正的价值。

返回的值是多少?

如果标量包含字符串,则它使用具有特定文档返回值的grok_number

  

返回号码的类型(0,如果无法识别),否则它是IS_NUMBER_IN_UVIS_NUMBER_GREATER_THAN_UV_MAXIS_NUMBER_NOT_INT,{{1}的位或组合},IS_NUMBER_NEGIS_NUMBER_INFINITY(在IS_NUMBER_NAN中定义)。

否则,它使用

perl.h

你不知道这两个中的哪一个被使用了,所以你不能把这个意义归咎于价值,这就是为什么它没有文件记录。

答案 1 :(得分:6)

这是documentation所说的:

  

Looks_like_number EXPR

     

如果perl认为EXPR是一个数字,则返回true。请参阅perlapi中的“looks_like_number”。

这句话中的link to perlapi不幸地帮助了我们很多:

  

测试SV的内容是否类似于数字(或数字)。天道酬勤   和无穷大被视为数字(因此不会发出非数字   警告),即使你的atof()没有理解他们。 Get-magic被忽略了。

I32   looks_like_number(SV *const sv)

就我而言,您的代码将返回一个不是0的整数,这是真的。

  • 当我使用4352时,我得到11
  • 当我使用'11'时,我得到1

所有这些都是真的,所以这很有效。

  • 当我提出'test''foobar'时,我得到0,这不是真的。
  • 对于任何看起来不像数字的东西,我都没有1
  • 我尝试'1e1'并打印4,这是一个真正的值,输入看起来像科学记数法中的数字。

所以,我会说如果Perl认为输入看起来像一个数字,它总会返回一些真实的东西,尽管我不知道这个真正值代表什么。我无法确认它是否也以名称返回true。

答案 2 :(得分:6)

不要依赖于确切的数值。这是一个抽象泄漏,最新版本的Scalar::Util(1.39)修复了这个问题。重要的是结果的真实性,而不是其确切的数值。

请参阅错误https://rt.cpan.org/Ticket/Display.html?id=94806