PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 113


$d1  = ParseDate( Tue,   26 May 1998 23 57 38 -0400 ),

$d2 = ParseDate( Wed,   27 May 1998 05 04 03 +0100 ),

print  DateCalc($d1,   $d2),

+0:0.0:0:0:6:25

Возможно, с такими данными удобно работать программе, но пользователь все же предпочтет что-нибудь более привычное. Программа hopdelta из примера 3.1 получает заголовок сообщения и пытается проанализировать дельты (разности) между промежуточными остановками. Результаты выводятся для местного часо­вого пояса.

Пример 1.3. hopdelta

tt'/usr/bin/perl

# hopdelta - по заголовку почтового сообщения выдает сведения


3.11. Программа: hopdelta   111

U                      о задержке почты на каждом промежуточном участке

use strict

use Date Manip qw (ParseDate UnixDate),

# Заголовок печати, из-за сложностей printf следовало

#  бы использовать format/write

printf %-20 20s %-20 20s 96-20 20s  %s\n ,

Sender , Recipient , Time , Delta ,
$/ =              # Режим абзаца

$_ = о             # Читать заголовок

s/\n\s+/ /g,         й Объединить строки продолжения

# Вычислить, когда и где начался маршрут сообщения
my($start_from) = /"From *\@(["\s>]«)/m,
my($start_date) = /"Date \s+( *)/m,

my $then = getdate($start_date),

printf %-20 20s %-20 20s %s\n , Start , $start_from, fmtdate($then)

my $prevfrom = $start_from

# Обрабатывать строки заголовка снизу вверх
for (reverse split(/\n/)) {

my ($delta, $now, $from, $by, $when),

next unless /"Received /

s/\bon ( *?) (id *)/, $1/s,       n Кажется, заголовок qmail

unless (($when) = / \s+( *)$/) {   # where the date falls

warn bad received line $_ ,

next

($from) = /from\s+(\S+)/,

($from) = /\(( *9)\)/ unless $from     # Иногда встречается

$from =~ s/\)$//,        й Кто-то пожадничал

($by)  = /by\s+(\S+\ \S+)/ # Отправитель для данного участка

# Операции, приводящие строку к анализируемому формату for ($when) {

s/ (for|via) *$//,

s/([+-]\d\d\d\d) \(\S+\)/$V,

s/id \S+,VW/.

next unless $now = getdate($when),  tt Перевести в секунды




- Начало -  - Назад -  - Вперед -