Возвращение признака неудачного вызова
Проблема
Функция должна возвращать значение, свидетельствующее о неудачной попытке вызова.
Решение
Воспользуйтесь командой
return
без аргументов, которая в скалярном контексте возвращает
undef,
а в списковом — пустой список ().
Комментарий
return без аргументов означает следующее:
sub empty_retval {
return ( wantarray ? () : undef );
}
Ограничиться простым return undef нельзя, поскольку в списковом контексте вы получите
список из одного элемента: undef. Если функция вызывается в виде:
if (@а = yourfunc()) { ... }
то признак ошибки будет равен true, поскольку @а присваивается список (undef),
интерпретируемый в скалярном контексте. Результат будет равен 1 (количество элементов в @а),
то есть истинному значению. Контекст вызова можно определить с помощью функции
wantarray,
однако return без аргументов обеспечивает более наглядное и изящное решение, которое
работает в любых ситуациях:
unless ($a = sfunc()) { die "sfunc failed" }
unless (@a = afunc()) { die "afunc failed" )
unless (%a = hfunc()) { die "hfunc failed" }
Некоторые встроенные функции Perl иногда возвращают довольно странные значения.
Например, fcntl и ioctl в некоторых ситуациях возвращают строку "О but true"
(для удобства эта волшебная строка была изъята из бесчисленных предупреждений об
ошибках преобразования флага -w). Появляется возможность использовать конструкции следующего вида:
ioctl(....) or die "can't ioctl: $!";
В этом случае программе не нужно отличать определенный ноль от неопределенного значения,
как пришлось бы делать для функций read или glob. В числовой интерпретации "О but true"
является нулем. Необходимость в возвращении подобных значений возникает довольно редко.
Более распространенный (и эффектный) способ сообщить о неудаче при вызове функции
заключается в инициировании исключения.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|