Программирование >>  Программный интерфейс приложений 

1 ... 115 116 117 [ 118 ] 119 120 121 ... 264


Генерация списка приглашенных на банкет

Для этого формата нам необходимы только имена участников. Инициализация и очистка памяти не нужны. Нужна только функция форматирования записи:

sub format banquet entry {

my {$entry ref) = shift; my {$name);

$name = $entry ref->{first name) . .

$entry ref->{last name};

if {$entry ref->{suffix}) # суффикс имени

# без запятых в суффиксах типа I, II, III, и т. д. $name .= , unless $entry ref->{suffix} =~ / [IVX]+$/; $name .= . $entry ref->{suffix} if $entry ref->{suffix};

print $name\n ;

Аргументом format banquet entry () является ссылка на данные в столбцах строки. Эта функция конкатенирует имена и фамилии и прибавляет суффикс, если таковой имеется. Особенность этой проблемы заключается в том, что суффиксам, подобным Jr. или Sr. , должны предшествовать запятая и пробел, в то время как суффиксам, подобным II или III , должны предшествовать только пробелы:

Michael Alvis IV Clarence Elgar, Jr. Bill Matthews, Sr. Mark York II

Потому, что букв I , v и x достаточно для отображения всех поколений от 1-го до 39-го, определение, надо или не надо добавлять запятую, можно произвести с помощью следующего теста:

$name .= , unless $hash ref->(suffix} =~ / [IVXl+S/;

Код подпрограммы format banquet entry (), производящий склеивание имен и фамилий, нам также пригодится для формирования RTF-версии нашего каталога. Однако вместо простого дублирования этого кода в функцию format rtf entry () преобразуем этот код в функцию:

sub format name {

my ($entry ref) = shift; my ($name);

$name = $entry ref->{first narae} . . $entry ref->{last narae};

if {$entry ref->{suffix}) # вот суффикс имени

# без запятых в суффиксах типа I, II, III, и т. д. $name .= , unless $entry ref->(suffix} =- / [IVX]+$/;



$name .= . $entry ref->{suffix} if $entry ref->{suffix};

return ($name);

Перенос в функцию f ormat name () кода, преобразующего строку имени, сводит функцию format banquet entry {) к одной строке:

sub format banquet entry {

printf %s\n , format name ($ [0]); }

Генерация каталога в формате, пригодном для печати

Создание RTF-версии каталога - задача несколько более сложная, чем создание списка участников банкета. С одной стороны, необходимо получать больше информации из каждой записи. С другой стороны, для того, чтобы достичь желаемого результата, в формате RTF каждую запись необходимо сопровождать управляющим кодом. Минимальное окаймление документов в RTF-формате выглядит следующим образом:

{\rtfO

{\fonttbl {\fO Times;}} \plain \fO \fs24

...здесь идет содержание документа...

Документ начинается и заканчивается фигурными скобками { и } . Ключевые слова формата RTF начинаются с обратной косой черты. Таким образом, первым ключевым словом документа должно быть \rtfn, где п - это спецификация номера версии формата RTF. Версия О вполне подходит для наших целей.

Таблица шрифтов определяется внутри документа. Эта таблица будет использоваться для отображения документа. Информация о таблице шрифтов приводится в группе символов, начинающейся с фигурных скобок, начинающихся с ключевого слова \fonttbl и информацией о штифте. Таблица шрифтов, приведенная в данных набросках кода, определяет шрифт Times номер 0. (Здесь можно задать сразу несколько штифтов.)

Несколько директив, следующих за этим, определяют стиль форматирования по умолчанию. Так, \plain выбирает простой формат, \fO выбирает шрифт О (который был определен нами в таблице шрифтов как Times), а \fs24 устанавливает размер шрифта 12 точек (число, следующее за \f, обозначает размер в полуточках). Совсем необязательно устанавливать границы, так как большинство текстовых процессоров имеют приемлемые значения по умолчанию.

Реализуем простой подход, при котором каждая строка будет распечатана в виде последовательности строк с меткой в каждой строке. Если информация, соответствующая определенной выводимой строке отсутствует, строка



не печатается. (Например, строка Email: не будет распечатываться для членов, не имеющих электронного адреса.) Есть и такие строки (как, скажем, строка Address: ), которые являются составными и состоят из информации, содержащейся в нескольких столбцах (street, city, state, zip). Отсюда видно, что сценарий должен уметь работать с совокупностью недостающих значений. Вот пример формата вывода данных, которым мы здесь воспользуемся.

Name: Mike Artel

Address: 4264 Levering Rd., Miami, FL 12777 Telephone: 075-961-0712 Email: mike artel@venus.org

Interests: Civil Rights,Education, Revolutionary War Представление в RTF-формате будет иметь вид: \b Name: Mike Artel\bO\par

Address: 4264 Levering Rd., Miami, FL I2777\par Telephone: 075-961-07!2\par Email: mike artel@venus.org\par

Interests: Civil Rights,Education,Revolutionary War\par

Для того чтобы строка Name: распечатьшалась жирным шрифтом, ее необходимо предварить \Ь (с последующим пробелом) для включения жирного шрифта и \Ь0 для отключения жирного шрифта. Каждая строка в конце снабжена маркером параграфа (\раг) для того, чтобы текстовый редактор перешел к следующей строке.

Функция инициализации содержит предшествующие символы управления формата RTF (для получения одинарной косой обратной черты при печати необходимо ее продублировать):

sub rtf init {

print {\\rtfO\n ;

print (Wfonttbl {\\fO Times; }) \n ; print Wplain \\fO \\fs24\n ;

Аналогично, функция очистки содержит завершающие символы управления формата RTF (которых не так уж и много!):

sub rtf cleanup {

print }\n ;

Здесь самая большая сложность заключается в форматировании данных из таблицы, но даже это не самая сложная задача. Основную сложность составляет форматирование строки с адресом и определение, какие строки печатать, а какие нет:

sub format rtf entry {

my ($entry ref) = shift; my (?address);



1 ... 115 116 117 [ 118 ] 119 120 121 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика