Внизу документации формата Perl написано:
Лексические переменные (объявленные с "my") не видны в формате, если формат не объявлен в рамках лексической переменной.
Чтение, которое подразумевает, что то, что вы пытаетесь, будет работать, но очевидно, что переменные с лексической областью работают по-разному для format
и write
при вызове извне пакета, в котором они были объявлены. Кроме того, все примеры в статья использовать глобальные переменные ...
В этом более современном руководстве по формату повторяется, что вы можете столкнуться с проблемами, если будете использовать переменные с лексической областью (переменные, объявленные с my
), потому что write выбирает переменные из текущего пакета и, как указано в комментарии вашего вопроса были написаны в то время, когда в Perl не было ключевого слова my
или лексической области видимости.
Решения, предлагаемые в статье:
Когда вы готовы вывести некоторые данные, вы используете запись. Этот дизайн показывает возраст форматов, так как write не принимает аргументов для заполнения изображений. Он использует переменные, которые находятся в области видимости.
our( $id, $name, $food, $amount ) = qw( 12 Buster Tuna 1.0 );
write();
Форматы также немного хитры, потому что вы не передаете аргументы для записи, чтобы заполнить картинки. Perl полагается на переменные с указанными именами, находящимися в области видимости. Вы можете использовать лексические переменные, но они должны быть в той же области видимости, что и определение формата, и они должны находиться в области видимости, когда вы вызываете write. Это нецелесообразно делать с лексическими выражениями, поэтому самый гибкий способ - использование локализованных переменных пакета:
foreach my $record ( @cats ) {
local( $id, $name, $food ) = @$record;
write( $fh );
}
А также этот совет в заключение:
- Используйте локализованные переменные пакета, чтобы установить данные для формата
Таким образом, our
и local
, похоже, являются подходящим вариантом, если вы хотите продолжать использовать format
и write
в современном Perl.