6

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

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

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

此代码打印1if$name包含一个字符串和一个静态数字 if$name包含一个整数(即每个整数 4352)。

我在 Windows 上使用 Perl。

4

3 回答 3

19

你忘了问一个问题!这里有两种可能性。

为什么它不总是为 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)

您无法分辨使用了两者中的哪一个,因此您无法将意义赋予该值,这就是它未记录的原因。

于 2013-10-05T20:04:08.007 回答
7

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

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

于 2014-06-25T22:42:01.433 回答
6

这就是文档所说的:

看起来像数字 EXPR

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

不幸的是,这句话中指向 perlapi的链接并没有真正帮助我们:

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

I32   looks_like_number(SV *const sv)

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

  • 4352用的时候得到11
  • 当我使用时,'11'我得到了1.

所有这些都是真实的,因此有效。

  • 当我 put'test''foobar'I got0时,这是不正确的。
  • 我从来没有得到1任何看起来不像数字的东西。
  • 我试了一下'1e1',它打印出来4了,这是一个真值,输入看起来像科学计数法中的数字。

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

于 2013-10-05T19:02:39.400 回答