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

Ash*_*rya 6 perl

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

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

my $name = 11;
print looks_like_number ($name);
Run Code Online (Sandbox Code Playgroud)

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

我在Windows上使用Perl.

ike*_*ami 17

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

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

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

返回的价值是多少?

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

类型的数目被返回(0如果未识别),否则是的比特位或组合IS_NUMBER_IN_UV,IS_NUMBER_GREATER_THAN_UV_MAX,IS_NUMBER_NOT_INT,IS_NUMBER_NEG,IS_NUMBER_INFINITY,IS_NUMBER_NAN(在定义perl.h).

否则,它使用

SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK)
Run Code Online (Sandbox Code Playgroud)

你无法分辨这两个中的哪一个被使用,所以你不能将意义归咎于价值,这就是为什么它没有记录.


Leo*_*erd 7

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

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


sim*_*que 6

这是文档说的:

look_like_number EXPR

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

在这句话中,perlapi链接并不是真的帮助了我们很多:

测试SV的内容是否看起来像数字(或数字).Inf和Infinity被视为数字(因此不会发出非数字警告),即使你的atof()没有理解它们.Get-magic被忽略了.

I32   looks_like_number(SV *const sv)
Run Code Online (Sandbox Code Playgroud)

在我的例子中,你的代码将返回一个不是的整数0,这是真的.

  • 我用的4352时候才拿到11.
  • 当我用'11'我的时候1.

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

  • 当我放'test''foobar'我得到0,这是不正确的.
  • 我从来没有得到1任何看起来不像数字的东西.
  • 我试过'1e1'并打印出来4,这是一个真正的价值,输入看起来像科学记数法中的数字.

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