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

检查应该是假的,因为 $line 不是未定义的(我在第一行定义了它)。为什么此代码段打印出“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)它是一个布尔语句。

==一个数字等于。由于$line是文本,它的值为0。数字上也是如此undef。这($line == undef)是真的。

您应该始终将以下内容放在程序的顶部:

use strict;
use warnings;

人们还提出了其他 pragma,但这是最重要的两个。他们会发现你 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容易出现被遗忘的\n错误,我更喜欢使用say

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 回答