Анимация
JavaScript
|
Главная Библионтека Вызов формата Вызов формата производится с помощью функции write. Эта функция получает имя дескриптора файла и генерирует для этого дескриптора текст, используя текущий для данного дескриптора формат. По умолчанию таким форматом является формат с тем же именем, что и у дескриптора файла (так, для дескриптора stdout используется формат stdout). Скоро вы узнаете, как этот порядок можно изменить. Давайте еще раз обратимся к формату адресной этикетки и создадим файл, в котором содержится несколько таких этикеток. Вот фрагмент программы; format ADDRESSLABEL = I @<<«<<<<<<<<<<<<<<<<<<<<< I $name I @<<<<<<«<<<<<<<<<<<<<<<<< I $addres3 I @<<<<<<««<<<<<, @< @«« I $city, $state, $zip open(ADDRESSLABEL,">labels-to-print") die "cant create"; open (ADDRESSES,"addresses") die "cannot open addresses"; while (<ADDRESSES>) ( chomp; # удалить символ новой строки (5name, $address,$city,$state,$zip) = split (/:/); # загрузить глобальные переменные write (ADDRESSLABEL); # send the output Здесь мы видим уже знакомое определение формата, но теперь у нас есть и выполняемый код. Сначала мы открываем дескриптор для выходного файла, который называется labels-to-prmt. Отметим, что имя дескриптора файла (addresslabel) совпадает с именем формата. Это важно. Затем мы открываем дескриптор для файла, содержащего список адресов. Предполагается, что этот список имеет следующий формат; Stonehenge:4470 SW Hall Suite 107 :Beaverton:OR:97005 Fred Flintstone : 3737 Hard Roclc Lane :Bedrock: OZ ; 999bc Другими словами, список содержит пять разделенных двоеточиями полей, которые наща программа анализирует описанным ниже образом. Цикл whi 1е в программе считывает строку из файла адресов, избавляется от символа новой строки, а затем разбивает то, что осталось, на пять переменных. Обратите внимание; имена переменных - те же самые, которые мы использовали, определяя формат. Это тоже важно. После загрузки значений всех необходимых для работы с форматом переменных функция write вызывает формат. Отметим, что параметром функции write является дескриптор файла, в который будет осуществляться запись; кроме того, по умолчанию используется формат с тем же именем. Каждое поле в формате заменяется соответствующим значением из следующей строки формата. После обработки двух приведенных в примере записей файл labels-to-print будет содержать следующее: I Stonehenge I 4470 SW Hall Suite 107 I Beaverton , OR 97005 I Fred Flintstone I 3737 Hard Rock Lane I Bedrock , OZ 999bc I Еще о поледержателях Из примеров вы уже поняли, что поледержатель @<<<< обозначает выровненное по левому краю поле, которое содержит пять символов, а @<<<«<<<<< - выровненное по левому краю поле, содержащее одиннадцать символов. Как мы и обещали, опишем поледержатели более подробно. Текстовые поля Большинство поледержателей начинается со знака @. Символы, стоящие после него, обозначают тип поля, а число этих символов (включая @) соответствует ширине поля. Если после знака @ стоят левые угловые скобки («<<), поле выровнено по левому краю, т.е. в случае, если значение окажется короче, чем отведенное для него поле, оно будет дополняться справа символами пробела. (Если значение слишком длинное, оно автоматически усекается; структура формата всегда сохраняется.) Если после знака @ стоят правые угловые скобки (>»>), поле выровнено по правому краю, т.е. в случае, если значение окажется короче, чем отведенное для него поле, оно будет заполняться пробелами слева. Наконец, если символы, стоящие после знака @, - повторяющаяся несколько раз вертикальная черта (), то поле центрировано. Это означает, что если значение слишком короткое, производится дополнение пробелами с обеих сторон, в результате значение будет расположено по центру поля. Числовые поля Следующий тип поледержателя - числовое поле с фиксированной десятичной запятой, полезное для больших финансовых отчетов. Это поле также начинается со знака @; за ним следует один или более знаков # с необязательной точкой (она обозначает десятичную запятую). Опять-таки, знак @ считается одним из символов поля. Например; format MONEY = Assets: @#####.## Liabilities: @#####.## Net: @#####.## $assets, $liabilities, $assets-$liabilities Эти три числовых поля предусматривают шесть знаков слева от десятичной запятой и два справа (в расчете на суммы в долларах и центах). Обратите внимание на то, что в формате используется выражение - это абсолютно допустимо и встречается очень часто. Ничего оригинального в Perl больше нет: вам не удастся установить формат с плавающей запятой для вывода значений денежных сумм, нельзя также заключить отрицательные значения или что-нибудь подобное в квадратные скобки. Для этого придется писать отдельную программу, например: format MONEY = Assets: @<<<<<<<<< Liabilities: @<<<<<<<< Net: @<<<<<<<<< 4соо1($assets,10), Scool ( $iiab,9), scool($assets-$liab,10) sub pretty { my($n,$width) = @ ; $width -= 2; # учтем отрицательные числа $n = sprintf("°.2f",$n); # sprintf описывается в одной из следующих глав if ($п < 0) { return sprintf ("[%$width.2f]", -$n); # отрицательные числа # заключаются в квадратные скобки } else ( return sprintf {" %$width.2f ", $n) ; # положительные числа выделяются # пробелами ## body of program; $assets = 32125.12; $liab = 45212.15; write (MONEY) ; Многостроковые поля Как уже упоминалось выше, при подстановке значения, содержащегося в строке значений, Perl обычно заканчивает обработку строки, встретив в этом значении символ новой строки. Многостроковые поледержатели позволяют использовать значения, которые представляют собой несколько 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [ 49 ] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |