LINUX.ORG.RU

perl regexp


0

0

Не могу придумать как в Perl можно сделать следущее,
есть вывод команды mailq

/var/spool/mqueue (5 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
j8EH6M8T013007 3936 Wed Sep 14 20:06 <>
(Deferred: Connection timed out with smtp.getontheweb.com.)
<wesaqhg@uyu.com>
j8EDTNEh012093 345 Wed Sep 14 16:29 <K.C@aqs.lv>
(Deferred: Connection timed out with cisco.lv.)
<vsazonov@cisco.lv>
j8E9E0EO010155 5467 Wed Sep 14 12:14 <>
8BITMIME (Deferred: Connection timed out with test.icelo.lv.)
<nobody@test.icelo.lv>
j8BKW0Lm023668 9445 Sun Sep 11 23:32 <>
(Deferred: boze.latnet.lv.: No route to host)
<regulate@boze.latnet.lv>
j8AH97hG002776 1062 Sat Sep 10 20:09 <>
(Deferred: Connection refused by mail.t-mail.com.)
<QiXaK@t-mail.com>
Total requests: 5

Как можно отделить сообщения друг от друга, если они в несколько строк.

я пробывал вот так, но у меня ни чего не получается:

my $str = `mailq`;
my @var = split (/^\S/,$str);
print join ('!!!',@var);

anonymous

Форматирование подводит,
вот как это выглядит в cat -A

^I^I/var/spool/mqueue (5 requests)$
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------$
j8EH6M8T013007 3936 Wed Sep 14 20:06 <>$
(Deferred: Connection timed out with smtp.getontheweb.com.)$
^I^I^I^I^I <wesaqhg@uyu.com>$
j8EDTNEh012093 345 Wed Sep 14 16:29 <K.C@aqs.lv>$
(Deferred: Connection timed out with cisco.lv.)$
^I^I^I^I^I <vsazonov@cisco.lv>$
j8E9E0EO010155 5467 Wed Sep 14 12:14 <>$
8BITMIME (Deferred: Connection timed out with test.icelo.lv.)$
^I^I^I^I^I <nobody@test.icelo.lv>$
j8BKW0Lm023668 9445 Sun Sep 11 23:32 <>$
(Deferred: boze.latnet.lv.: No route to host)$
^I^I^I^I^I <regulate@boze.latnet.lv>$
j8AH97hG002776 1062 Sat Sep 10 20:09 <>$
(Deferred: Connection refused by mail.t-mail.com.)$
^I^I^I^I^I <QiXaK@t-mail.com>$
^I^ITotal requests: 5$

anonymous
()

Ну тут три варианта
1) не использовать регулярные выражения на уровне разделения
2) считать в большую строку и использовать /s (single-line)
примерно вот так:
while ($file=~s/(выбор одного сообщения)//s) {
my $msg=$1
}
3) либо читать построчно (если например не факт что ровно три строки на одну запись) и проверять регулярным выражением факт наступления следующего выражения.

Как лучше делать - тебе решать

vahvarh ★★★
()

Сплить по (чтото типа того но не то.. думай сам)"[^<]+\s<[\w\d]+@[\w\d]+\.\w{2,4}>\$$"
по идее так приблезительно можно поделить записи..
потом делай что хош дальше.

Успехов. надеюсь поможет хоть чуть :)

godexsoft
()
Ответ на: комментарий от godexsoft

Вы будете смеятся но помагло добавление 'm' в split PATTERN


$str = `mailq`;
my @var = split (/^\S/m,$str);
print join ('!!!',@var);


Вот результат:

!!!8E9E0EO010155 5467 Wed Sep 14 12:14 <>$
8BITMIME (Deferred: Connection timed out with test.icelo.lv.)$
^I^I^I^I^I <nobody@test.icelo.lv>$
!!!8BKW0Lm023668 9445 Sun Sep 11 23:32 <>$
(Deferred: boze.latnet.lv.: No route to host)$
^I^I^I^I^I <regulate@boze.latnet.lv>$
!!!8AH97hG002776 1062 Sat Sep 10 20:09 <>$
(Deferred: Connection refused by mail.t-mail.com.)$
^I^I^I^I^I <QiXaK@t-mail.com>$

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.