0
my $line = "hello";
print ($line == undef);

$line は未定義ではないため、チェックは false である必要があります (最初の行で定義しました)。このコード スニペットが「1」を出力するのはなぜですか?

4

2 に答える 2

4

いつも入れる

use strict; use warnings;

また

use Modern::Perl;

いくつかのエラーが表示されます:

Use of uninitialized value in numeric eq (==) at /tmp/sssl.pl line 3.
Argument "hello" isn't numeric in numeric eq (==) at /tmp/sssl.pl line 3.

変数が定義されているかどうかをテストするには、次を使用します。

print "variable defined" if defined $variable;

文字列を別の文字列に対してテストするには、次を使用します。

if ($string eq $another_string) { ... }
于 2014-03-12T20:57:40.943 に答える
4

それはあなたが言ったことを正確にやっています。

print ($line == undef);

はブール値であるため、ブール値を出力しています($line == undef)

数値==の等号です。はテキストなので、値はです。数値的にもそうです。このように真です。$line0undef($line == undef)

プログラムの一番上に、常に次のものを配置する必要があります。

use strict;
use warnings;

人々が入れたプラグマは他にもありますが、これらは最も重要な 2 つです。彼らはあなたのエラーの 90% を見つけます。このプログラムを試してください:

use strict;
use warnings;
my $line = "hello";
print ($line == undef)

あなたは得るでしょう:

Use of uninitialized value in numeric eq (==) at ./test.pl line 6.
Argument "hello" isn't numeric in numeric eq (==) at ./test.pl line 6.

もちろん、初期化されていない値があります! を使用してundefいます。もちろんhello、数値ではありません。

私はあなたが何を望んでいるのか完全にはわかりません。hello定義されていない場合、印刷しますか? そのブールステートメントの値を見ようとしていますか?

ラインの最後に置かない\n端についてはどうですか?printあなたはそれが欲しいですか?忘れられたエラーprintが発生しやすいため、次を使用することを好みます。\nsay

use strict;
use warnings;
use feature qw(say);   # Say is like print but includes the ending `\n`

my $line = "hello";
say (not defined $line);    # Will print null (false) because the line is defined
say ( defined $line);       # Will print "1" (true).
say ( $line ne undef);      # Will print '1' (true), but will give you a warning.
say $line if defined line;  # Will print out $line if $line is defined
于 2014-03-12T22:53:54.757 に答える