为什么这个字符串undef检查返回true?

时间:2014-03-12 20:53:49

标签: string perl undef

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

检查应该为false,因为$ line未定义(我在第一行中定义了它)。为什么此代码段打印出来' 1'?

2 个答案:

答案 0 :(得分: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) { ... }

答案 1 :(得分:4)

它正是你所说的。

print ($line == undef);

您打印出一个布尔值,因为($line == undef)是一个布尔语句。

==数字等于。由于$line是文字,因此其值为0undef数字也是如此。因此($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?您是否尝试查看该布尔语句的值?

\nprint没有放在行尾的那个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

{{1}}