Perl 关于相等运算符的警告
Perl中是否发生了一些变化,或者一直是这样,第二个例子(Perl 关于相等运算符的警告,perl,operators,warnings,Perl,Operators,Warnings,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.
$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.
一直都是这样
在第一个if
,l
被认为是在数字上下文中。但是,l
不能转换为数字。因此,发出警告
在第二个
if
中,数字1
被视为在字符串上下文中。因此,在比较之前,数字1
被转换为字符串'1'
,因此不会发出警告。Perl将尝试将标量转换为使用它的上下文所需的类型
有一个从任何标量类型到字符串的有效转换,所以这总是以静默方式完成的
如果字符串通过了一个看起来像\u number
测试(可通过访问),则也会以静默方式转换为数字。否则会发出警告,并进行“最佳猜测”近似
my $string = '9';
if ( $string == 9 ) { print "YES" };
将字符串静默地转换为整数9,测试成功并打印YES
my $string = '9,8';
if ( $string == 9 ) { print "YES" };
引发警告参数“9,8”在数值等式(=)
中不是数字,将字符串转换为整数9,测试成功并打印是
my $string = '9,8';
if ( $string == 9 ) { print "YES" };
据我所知,至少从v5.0开始,它一直是这样的。您是否故意使用小写“L”?通常很难区分小写字母“L”和1之间的区别。如果你用一个来代替,你会回答你自己的问题
>perl -wE"say '1' == 0;"
>perl -wE"say 1 eq 'a';"
>
如你所见
- 如果需要一个数字,Perl将在没有警告的情况下将字符串转换为数字
- 如果需要字符串,Perl将在没有警告的情况下将数字转换为字符串
非常一致
当您尝试将小写L转换为数字时,会收到警告,但这怎么会令人惊讶呢