我试图找出输入是数字还是字符串。我遇到了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。
答案 0 :(得分:17)
你忘了提问了!这有两种可能性。
为什么不呢?它返回一个记录的真值。它没有区别真正的价值。
如果标量包含字符串,则它使用具有特定文档返回值的grok_number
。
返回号码的类型(
0
,如果无法识别),否则它是IS_NUMBER_IN_UV
,IS_NUMBER_GREATER_THAN_UV_MAX
,IS_NUMBER_NOT_INT
,{{1}的位或组合},IS_NUMBER_NEG
,IS_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)修复了这个问题。重要的是结果的真实性,而不是其确切的数值。