Почему эта строка undef check возвращает true?

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

Проверка должна быть ложной, так как $line не является неопределенной (я определил ее в первой строке). Почему этот фрагмент кода печатает '1'?

2 ответа

Решение

Он делает именно то, что вы сказали.

print ($line == undef);

Вы печатаете логическое значение, потому что ($line == undef) это логическое утверждение.

== является числовым равно поскольку $line это текст, он имеет значение 0, Так же undef численно. таким образом ($line == undef) правда.

Вы всегда должны помещать следующее в верхней части вашей программы:

use strict;
use warnings;

Есть и другие прагмы, которые люди ставят, но это две самые важные. Они найдут 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

Всегда ставлю

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) { ... }
Другие вопросы по тегам