关于等式运算符的警告

时间:2012-05-25 07:37:49

标签: 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.

3 个答案:

答案 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';"


>

如您所见,

  • 如果需要一个号码,Perl会将字符串转换为数字而不会发出警告
  • 如果需要字符串,Perl会将数字转换为字符串而不会发出警告

非常一致。

当您尝试将小写字母L转换为数字时会收到警告,但这有多令人惊讶?