|
Программирование >> Программный интерфейс приложений
printf \\b Name: %s\\bO\\par\n , format name (Sentry ref); Saddress = ; Saddress .= $entry ref->{street) if Sentry ref->{street} ; Saddress .= , . Sentry ref->{city} if $entry ref->{city}; Saddress .= , . $entry ref->{state) if $entry ref->{state}; Saddress .= . Sentry ref->{zip} if $entry ref->{zip}; print Address: Saddress\\par\n if Saddress; print Telephone: $entry ref->{phone}\\par\n if $entry ref->{phone}; print Email: $entry ref->{email}\\par\n if. $entry ref->{email}; print Interests: Sentry ref->{interests}\\par\n if Sentry ref->{interests}; print \\par\n ; Вы, конечно, не ограничены определенным стилем форматирования и можете вносить свои изменения, модифицировав format rtf entry (). Такую операцию осуществить не так уж просто с самим документом (документ в текстовом редакторе)! Теперь сценарий gendir можно считать завершенным. Каталог можно распечатать в любом из форматов, просто запустив его из командной строки: % gen dir banquet > names.txt % gen dir rtf > directory.rtf Сценарий gendir можно запустить под управлением ОС Windows. В результате будут получены файлы, готовые к обработке в текстовом процессоре. Эти команды можно запустить под управлением ОС UNIX, а затем переслать полученные файлы по электронной почте с тем, чтобы обработать их под управлением ОС Macintosh. Это можно сделать с помощью почтовой программы mutt, которая позволяет прямо из командной строки с помощью опции -а производить соединения. Такая строка позволяет послать сообщение самому себе: % mutt -а names.txt -а directory.rtf paulgsnake.net Другие почтовые программы тоже позволяют передавать файлы, созданные в среде ОС UNIX, Однако файлы можно передать и другими средствами, например, такими как FTP. В любом случае, после того как файлы получены, это самый простой метод получения списка имен и копирования их в какой-либо документ. Интерфейс DBI упрощает процесс получения необходимой информации из СУБД MySQL, а возможности обработки текстов, имеющиеся в языке написания сценариев, легко позволяют преобразовывать информацию в нужный нам формат. СУБД MySQL не обладает такими механизмами форматирования выводимой информации. Но, вследствие той легкости, с которой можно интефировать возможности обработки данных в СУБД MySQL с возможностями такого языка как Perl, это уже не так и важно. Рассылка напоминаний об истечении срока членства Ведение списка Исторической Лиги в виде текстового документа требует много времени и несет в себе большую вероятность ошибок, кроме того, автоматизация процесса рассылки предупреждений в этом случае будет чрезвычайно затруднена. Теперь, когда информация находится в базе данных, посмотрим, каким образом можно автоматизировать этот процесс и рассылать напоминания таким людям по электронной почте. Главной задачей при этом является определение тех членов лиги, которым требуется такое обновление. Для создания такого запроса требуется относительно несложное вычисление относительной даты: SELECT ... FROM member WHERE expiration < DATE ADD(CURRENT DATE, INTERVAL интервал DAY) Параметр интервал указывает количество дней гарантированной отсрочки. Данный запрос выбирает перечень членов, которым необходимо возобновить членство. В частном случае при значении интервала, равном О, этот запрос находит членов, дата истечения членства которых уже прошла (т.е. срок членства которых уже истек). Что делать с обнаруженными записями? В качестве одного из вариантов можно предложить послать электронную почту прямо из такого сценария, но может быть уместно сначала просмотреть полученный список, не посылая никаких сообшений. Для этого воспользуемся процедурой, состояшей из двух этапов. м Этап 1. Запустить сценарий need renewal для определения членов, которым необходимо возобновить членство. Полученный список можно просто изучить или использовать в качестве источника данных для второго этапа рассылки предупреждений. ш Этап 2. Запустить сценарий renewal notifу, рассылающий сообшение пожалуйста, возобновите по электронной почте. Этот сценарий обязательно должен предупредить о людях, не имеющих электронной почты, с которыми нужно будет связаться другими средствами. На первом этапе этой задачи сценарий need renewal определяет, какому члену нужно такое обновление. Это можно сделать следующим образом. # по умолчанию интервал составляет 30 дней; # изменить в случае получения числового аргумента ту ($cutoff) = 30; $cutoff = slllft {@ARGV) if @ARGV && $ARGV[0] =~ / Xd+S/; warn интервал составляет $cutoff дней\п ; my ($stli) = $dbh->prepare (qq{ SELECT member id, email, last name, first name, expiration, TO DAYS(expiration) - TO DRYS(CURRENT DATE) AS days FROM member WHERE expiration < DATE ADD(CURRENT DATE, INTERVAL ? DAY) ORDER BY expiration, last name, first name $sth->execute ($cutoff); # передача интервала как маркера while (my $hash ref = $sth->fetchrow hashref ()) { print ]oin ( \t , $hash ref ->{member id}, $hash ref->{email), $hash ref ->(last name), $hash ref->{first name), $hash ref->{expiration), $hash ref->{days} . дней ) . \n ; $sth->finish 0; Вывод, получаемый из сценария need renewal, имеет следующий вид (вы получите другой результат, так как он определяется относительно текущей даты, которая, конечно же, должна отличаться). 89 g.steve@pluto.com Garner Steve 1999-08-03 -32 days 18 york mark@earth.com York Mark 1999-08-24 -11 days 82 john edwards@venus.org Edwards John 1999-09-12 -8 days Обратите внимание, что некоторые члены должны возобновить свое членство через отрицательное количество дней. Это значит, что срок их членства уже истек! (Такое довольно часто случается при ведении данных вручную. Теперь, после того, как учет таких членов был автоматизирован, мы увидели, что кого-то пропустили.) Вторая часть напоминания о возобновлении членства вызывает сценарий renewalnotif у, который высьшает эти напоминания по электронной почте. Для того чтобы немного облегчить использование сценария renewalnotify, необходимо, чтобы он распознавал три типа аргументов командной строки- идентификационные номера, электронные адреса и имена файлов. Цифровые значения обычно являются идентификационными номерами, а аргументы, содержащие символ @ , можно смело относить к категории электронных адресов Любое другое значение интерпретируется как имя файла, который необходимо прочесть для получения идентификационных номеров или адреса электронной почты. Таким образом, параметры можно передавать из командной строки или файла (В частности, можно использовать вывод сценария need renewal как ввод сценария renewal notify.) Сценарий выбирает для каждого члена, которому будет разослано напоминание, электронный адрес и рассьшает сообщения по этим адресам. Если электронный адрес отсутствует, сценарий renewalnotify генерирует диагностическое сообщение, предупреждающее о том, что необходимо связаться с этими людьми каким-то другим образом.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.002
При копировании материалов приветствуются ссылки. |