我试图找出输入是数字还是字符串.我遇到了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.
ike*_*ami 17
你忘了提问了!这有两种可能性.
为什么不?它返回一个记录的真值.这与它的真正价值没有区别.
如果标量包含字符串,则使用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)修复了.重要的是结果的真实性,而不是其确切的数值.
请参阅错误https://rt.cpan.org/Ticket/Display.html?id=94806
这是文档说的:
look_like_number EXPR
如果perl认为EXPR是一个数字,则返回true.请参阅perlapi中的"looks_like_number".
测试SV的内容是否看起来像数字(或数字).Inf和Infinity被视为数字(因此不会发出非数字警告),即使你的atof()没有理解它们.Get-magic被忽略了.
Run Code Online (Sandbox Code Playgroud)I32 looks_like_number(SV *const sv)
在我的例子中,你的代码将返回一个不是的整数0,这是真的.
4352时候才拿到11.'11'我的时候1.所有这些都是真的,所以这很有效.
'test'或'foobar'我得到0,这是不正确的.1任何看起来不像数字的东西.'1e1'并打印出来4,这是一个真正的价值,输入看起来像科学记数法中的数字.所以,我会说如果Perl认为输入看起来像一个数字,它总会返回一些真实的东西,尽管我不知道这个真正值代表什么.我无法确认它是否也带有名称返回true.