Добрый день.
Не так давно начал изучать Perl (2 недели), до этого кроме #!/bin/sh ни на чем не программировал.
Поставил себе такую задачку - написать скрипт на Perl-е, который из журнала maillog (почтовый сервер Postfix 2.2.8) выбирает следующие данные: Месяц, число, время, ip-адрес отправителя, поля from и to и размер письма.
Все хорошо, но на некоторых письмах происходит затык - некоторые строки не разбиваются функцией split на элементы - бьюсь второй день, но причину не вижу.
Вот сама программа:
#!/usr/local/bin/perl
# Открыли файл, загнали все в массив @a
open(MAIL, "/home/admin/perl/maillog.0");
@a=<MAIL>;
close(MAIL);
$j=0;
for ($i=0;$i<$#a+1;$i++) {
$#b=0;
@b=split(/\s+/,$a[$i]); # Строку дробим на элементы
if (($b[6] =~ m/client=(.+)/) and ($b[6] ne 'client=localhost.domen.ru[127.0.0.1]'))
{
$c1[$j]=$b[5]; # получаем массив @c1, содержащий Message-ID писем, поступивших на обработку
$j++;
}
}
$j=0;
for ($i=0;$i<$#a+1;$i++) {
$#b=0;
@b=split(/\s+/,$a[$i]);
if ($b[6] eq 'removed')
{
$c2[$j]=$b[5]; # получили массив @c2, содержащий Message-ID писем, успешно обработанных и удаленных из очереди задач
$j++;
}
}
$k=0;
for ($i=0;$i<$#c1+1;$i++)
{ for ($j=0;$j<$#c2+1;$j++) {
if ($c1[$i] eq $c2[$j]) { $c[$k]=$c1[$i]; $k++; }}}
# Получили массив @c, содержащий пересечение массивов @c1 и @c2
$j=0;
for ($i=0;$i<$#a+1;$i++) {
$#b=0;
@b=split(/\s+/,$a[$i]);
if (($b[6] =~ m/client=(.+)/) and ($b[6] ne 'client=localhost.domen.ru[127.0.0.1]') and ($b[5] eq $c[$j]))
{
$d[$j]=$b[0]."\t".$b[1]."\t".$b[2]."\t";
$b[6] =~ s/client=(.+)\[(.+)\]/$2/g;
$d[$j].=$b[6].="\t\t";
$j++;
}
}
# Формируем массив @d, который будем заполнять нужными данными.
# До этого момента все работает нормально, а вот с полями from, to и size - беда - на некоторых строках не работает функция split.
$j=0;
for ($i=0;$i<$#a+1;$i++) {
$#b=0;
@b=split(/\s+/,$a[$i]);
if (($b[5] eq $c[$j]) and ($b[7] =~ m/size=(.+?),/))
{
$b[7] =~ s/size=(.+?),/$1/g;
$d[$j] .= $b[7];
$d[$j] .= "\t";
$j++;
}
}
Привожу кусок maillog-а, именно в этом месте скрипт затыкается:
Apr 6 02:10:33 newgateway postfix/smtpd[63214]: 61F8561C0E: client=unknown[68.56.22.107]
Apr 6 02:10:35 newgateway postfix/cleanup[63215]: 61F8561C0E: message-id=<20060405201033.61F8561C0E@newgateway.domen.ru>
Apr 6 02:10:35 newgateway postfix/qmgr[70203]: 61F8561C0E: from=<bj21@com2com.ru>, size=1335, nrcpt=1 (queue active)
Apr 6 02:10:36 newgateway postfix/lmtp[63170]: 61F8561C0E: to=<egor@domen.ru>, relay=127.0.0.1[127.0.0.1], delay=4, status=sent (250 2.0.0 Ok (2.0.0 <igor@domen.ru> OK ))
Apr 6 02:10:36 newgateway postfix/qmgr[70203]: 61F8561C0E: removed