在Perl中是否有变化或者总是这样,像第二个($number eq 'a'
)这样的例子不会发出警告?
#!/usr/bin/env perl
use warnings;
use 5.12.0;
my $string = 'l';
if ($string == 0) {};
my $number = 1;
if ($number eq 'a') {};
# Argument "l" isn't numeric in numeric eq (==) at ./perl.pl line 6.
答案 0 :(得分:6)
Perl将尝试将标量转换为使用它的上下文所需的类型。
从任何标量类型到字符串都有一个有效的转换,所以这总是以静默方式完成。
如果字符串通过looks_like_number
测试(可通过Scalar::Util
访问),也可以无声地转换为数字。否则会发出警告并且无论如何都会进行“最佳猜测”近似。
my $string = '9';
if ( $string == 9 ) { print "YES" };
将字符串静默转换为整数9,测试成功并打印YES
。
my $string = '9,8';
if ( $string == 9 ) { print "YES" };
引发警告Argument "9,8" isn't numeric in numeric eq (==)
,将字符串转换为整数9,测试成功并打印YES
。
据我所知,这一直是这样,至少从v5.0开始。
答案 1 :(得分:4)
就是这样。
在第一个if
中,l
被视为数字上下文。但是,l
无法转换为数字。因此,会发出警告。
在第二个if
中,数字1
被视为 string 上下文。因此,在比较之前,数字1
将转换为字符串'1'
,因此不会发出警告。
答案 2 :(得分:0)
您是否故意使用小写“L”?通常很难区分小写的“L”和“L”。如果你使用了一个问题,你会回答你自己的问题。
>perl -wE"say '1' == 0;"
>perl -wE"say 1 eq 'a';"
>
如您所见,
非常一致。
当您尝试将小写字母L转换为数字时会收到警告,但这有多令人惊讶?