Функция defined
|
1 2 |
defined EXPR defined |
Функция возвращает булево значение, и отвечает на вопрос: содержит EXPR определенное значение или нет.
Функция вернет false, если переменная еще не была инициализирована или ей было присвоено значение undef. True — если переменная была инициализирована любым значением, в том числе ей может быть присвоено значение числового нуля, пустой строки или строки содержащей символ нуля.
Именно этим defined отличается от стандартной булевой проверки, которая не может отличить undef от «0».
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
my $variable = "0"; if (defined $variable) { print "defined"; } else { print "undef"; } if ($variable) { print "defined"; } else { print "undef"; } |
Результат:
|
1 2 3 4 |
% perl defi.pl defined undef |
Функция undef
|
1 2 |
undef EXPR undef |
Функция undef всегда возвращает неопределенное значение. Если передать функции в качестве аргумента переменную — она присвоит ей неопределенное значение.
|
1 2 3 |
undef $variable; # или так $variable = undef; |
Есть небольшой интересный нюанс в использовании undef — не стоит использовать эту функцию для сравнения с переменными. Сравнение заданной переменной будет выполняться с числовым нулем или пустой строкой, а не с неопределенным значением. Результатом могут стать парадоксальные ситуации и ошибки.
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
my $variable = 0; if ($variable == undef) { print "var is undef"; } else { print "var is defined"; } if (defined $variable) { print "var is defined"; } else { print "var is undef"; } |
Вывод:
|
1 2 3 4 |
% perl defi.pl var is undef var is defined |
У меня вопрос. Вроде всё понятно, но..
while ($_ = $ARGV[0], /^-/) {
if(/^-d/ || /^-s/ || /^-e/) {
print $ARGV[0], «\n»;
}
else {
print «Неизвестный ключ $ARGV[0]\n»;
}
shift if defined $_;
}
Матюкается:
Use of uninitialized value $_ in pattern match (m//) at argv_shift.pl line 15.
Это строка в которой shift if…
У меня включена прагма strict. Нужна она мне.
Чё не понимаю?