Анимация
JavaScript


Главная  Библионтека 

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

Вызов формата

Вызов формата производится с помощью функции 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