Почему эта строка 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) { ... }