Даже если Perl может определить разницу между неинициализированным и пустым массивом (чего он не может), это не поможет вам определить, вернул ли get_apples
ошибку, потому что у вас не было бы способа заставить my @apples = get_apples()
неВыполните присваивание, когда произошла ошибка.
Возможно, вы ошибаетесь в том, что return @a
возвращает массив.Подпрограммы не могут возвращать массивы.Они могут вернуть только 0 или более скаляров.return @a
возвращает результат @a
, который является содержимым массива в контексте списка.
Невозможно отличить нулевые элементы, возвращенные из-за ошибки, от успешного ответа нулевого элемента черезвозвращаемые значения.(Конечно, вы можете использовать внеполосный канал, такой как исключение или глобальная переменная.)
Поскольку подпрограммы могут возвращать только список скаляров, вы можете сделать только две вещи:
- Подсчитайте количество возвращенных скаляров.
- Проверьте возвращенные скаляры.
Чтобы достичь своей цели, вам нужно найти случай, когда одиниз них различаются для ошибки и для успеха.
При возврате ссылки на массив проверяется, определено ли возвращаемое значение.
Можно сделать что-то подобное, если вернулось первое значение (если таковые имеются) успех всегда будет определяться, но это довольно уродливо.
sub apples {
if (...error...) {
return undef;
} else {
return ...;
}
}
my @apples = apples();
if (@apples && !defined($apples[0])) {
... an error occurred...
}
Я рекомендую против этого.