我试图找出输入是数字还是字符串。我遇到looks_like_number
并且无法理解它返回的值。
use warnings;
use Scalar::Util qw(looks_like_number);
my $name = 11;
print looks_like_number ($name);
此代码打印1
if$name
包含一个字符串和一个静态数字 if$name
包含一个整数(即每个整数 4352)。
我在 Windows 上使用 Perl。
我试图找出输入是数字还是字符串。我遇到looks_like_number
并且无法理解它返回的值。
use warnings;
use Scalar::Util qw(looks_like_number);
my $name = 11;
print looks_like_number ($name);
此代码打印1
if$name
包含一个字符串和一个静态数字 if$name
包含一个整数(即每个整数 4352)。
我在 Windows 上使用 Perl。
你忘了问一个问题!这里有两种可能性。
为什么不?它返回一个记录的真值。它是什么真正的价值没有区别。
如果标量包含一个字符串,它使用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)
您无法分辨使用了两者中的哪一个,因此您无法将意义赋予该值,这就是它未记录的原因。
不要依赖确切的数值。这是一个抽象泄漏,最新版本的Scalar::Util
(1.39) 修复了它。重要的是结果的真实性,而不是其确切的数值。
这就是文档所说的:
看起来像数字 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
.所有这些都是真实的,因此有效。
'test'
或'foobar'
I got0
时,这是不正确的。1
任何看起来不像数字的东西。'1e1'
,它打印出来4
了,这是一个真值,输入看起来像科学计数法中的数字。所以,如果 Perl 认为输入看起来像一个数字,我会说它总是返回真值,尽管我不知道那个真值究竟代表什么。我无法确认它是否也返回带有名称的 true。