3

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.
4

3 回答 3

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 开始。

于 2012-05-25T07:50:42.850 回答
4

一直是这样。

在第一个if,l被认为是在数字上下文中。但是,l不能转换为数字。因此,发出警告。

在第二个if中,数字1被认为是在字符串上下文中。因此,数字在比较之前1被转换为字符串'1',因此不会发出警告。

于 2012-05-25T07:48:36.657 回答
0

您是否故意使用小写“L”?通常很难区分小写的“L”和一。如果您使用的是一个问题,那么您会回答自己的问题。

>perl -wE"say '1' == 0;"


>perl -wE"say 1 eq 'a';"


>

如你看到的,

  • 如果需要一个数字,Perl 会将字符串转换为数字而不会发出警告
  • 如果需要一个字符串,Perl 会在没有警告的情况下将一个数字转换为字符串。

非常一致。

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

于 2012-05-25T15:21:42.630 回答