Вызов формата
Вызов формата производится с помощью функции write. Эта функция получает имя дескриптора файла и генерирует для этого дескриптора текст, используя текущий для данного дескриптора формат. По умолчанию таким форматом является формат с тем же именем, что и у дескриптора файла (так, для дескриптора stdout используется формат stdout). Скоро вы узнаете, как этот порядок можно изменить.
Давайте еще раз обратимся к формату адресной этикетки и создадим файл, в котором содержится несколько таких этикеток. Вот фрагмент программы:
format ADDRESSLABEL =
$name
$address
$city, $state, $zip
open(ADDRESSLABEL,">labels-to-print") || die "can't create";
open (ADDRESSES,"addresses") || die "cannot open addresses";
while (<ADDRESSES>) f
chomp; # удалить символ новой строки
($name,$address,$city,$state,$zip) = split (/:/);
# загрузить глобальные переменные
write (ADDRESSLABEL); # send the output }
Здесь мы видим уже знакомое определение формата, но теперь у нас есть и выполняемый код. Сначала мы открываем дескриптор для выходного файла, который называется labels-to-print. Отметим, что имя дескриптора файла (addresslabel) совпадает с именем формата. Это важно. Затем мы открываем дескриптор для файла, содержащего список адресов. Предполагается, что этот список имеет следующий формат:
Stonehenge:4470 SW Hall Suite 107 :Beaverton:OR:97005 Fred Flintstone:3737 Hard Rock Lane:Bedrock:OZ:999bc
Другими словами, список содержит пять разделенных двоеточиями полей, которые наша программа анализирует описанным ниже образом.
Цикл while в программе считывает строку из файла адресов, избавляется от символа новой строки, а затем разбивает то, что осталось, на пять переменных. Обратите внимание: имена переменных — те же самые, которые мы использовали, определяя формат. Это тоже важно.
После загрузки значений всех необходимых для работы с форматом переменных функция write вызывает формат. Отметим, что параметром функции write является дескриптор файла, в который будет осуществляться запись; кроме того, по умолчанию используется формат с тем же именем.
Каждое поле в формате заменяется соответствующим значением из следующей строки формата. После обработки двух приведенных в примере записей файл labels-to-print будет содержать следующее:
Stonehenge
4470 SW Hall Suite 107
Beaverton , OR 97005
Fred Flintstone 3737 Hard Rock Lane Bedrock , OZ 999bc