3

Perlで何かが変更されましたか、それとも常にこのようになっていますか?2番目の($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

2 番目ifの では、数値は文字列コンテキスト1にあると見なされます。したがって、数値は比較前に文字列に変換されるため、警告は発生しません。1'1'

于 2012-05-25T07:48:36.657 に答える
0

わざと小文字の「L」を使いましたか?小文字の「L」と小文字の「L」の違いを区別するのは難しいことがよくあります。代わりに質問を使用した場合は、自分の質問に答えていただろう。

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


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


>

ご覧のように、

  • 数字が必要な場合、Perlは警告なしに文字列を数字に変換します。
  • 文字列が必要な場合、Perlは警告なしに数値を文字列に変換します。

非常に一貫しています。

小文字のLを数値に変換しようとすると警告が表示されますが、それはどのように驚くべきことですか?

于 2012-05-25T15:21:42.630 に答える