Article View: pl.comp.lang.perl
Article #52093Re: problem logiczny ze skryptem
From: Szymon Sokół
Date: Mon, 06 Dec 2010 21:25
Date: Mon, 06 Dec 2010 21:25
91 lines
4186 bytes
4186 bytes
On Mon, 06 Dec 2010 21:10:18 +0100, Maciej Misiak wrote:
> 3. znaczenia pętli for ($i=309;$i>=31;$i--) nie rozumiem, więc pozostaje
> tylko przypuszczać: czytanie pliku "$dir/maillog.$i" wyciągnij przed tą
> pętlę. Po co 309-31 razy go wczytujesz? I x2, bo dla dwóch skrzynek?
Ej, skup się. On nie czyta tego samego pliku, tylko pliki o nazwach
maillog.309, maillog.308, i tak dalej aż do maillog.31.
Dlaczego akurat takie nazwy plików? A to już jego słodka tajemnica. Jeśli
nie chodzi o to, żeby z premedytacją pominąć nazwy spoza tego zakresu, to
prościej byłoby pewnie zrobić tak:
for my $nazwa (glob "$dir/mailbox.*") {
open UCHWYT, $nazwa;
itd.
Oczywiście ten program jest napisany tak koszmarnie, że podobnie jak Kacper
miałem problem ze zrozumieniem, co on właściwie robi, ale zgaduję, że chodzi
o wyszukanie w logach wszystkich linii, które odnoszą się do poczty od/do
danego użytkownika - czyli najpierw znajdujemy linie z danym adresem e-mail,
a potem wszystkie linie z takim samym queue id, jak te znalezione wcześniej.
Co oznacza, że można to zapisać znacznie zgrabniej, na dwa sposoby, z czego
przedstawiam tu tylko jeden, który wymaga dwukrotnego przeczytania logów,
ale jest oszczędniejszy z punktu widzenia pamięci niż drugi, który w
pierwszej kolejności wczytuje logi *w całości* do pamięci.
To byłoby jakoś tak:
#!/usr/bin/perl
use warnings;
use strict;
my $logi = '/var/log/mail.*';
my $output = '/var/log/wynik';
my @skrzynki = ('biuro@xxx.pl', 'marketing@xxx.pl');
my $regexp = join '|', map "\Q$_\E", @skrzynki;
my %qid;
# pierwszy przebieg
for my $nazwa (glob $logi) {
# jak się nie da otworzyć, pomijamy plik cichcem
open UCHWYT, '<', $nazwa or next;
while(<UCHWYT>) {
if($_ =~ /(?:from|to)=<($regexp)>/o) {
# znaleziono jeden z szukanych adresów
my $adres = $1;
# ustalamy queue-id
if(m/:\s([0-9A-F]{10}):\s/) {
# mapujemy queue-id na adres
$qid{$1} = $adres;
}
}
}
close UCHWYT;
}
# otwieramy sobie pliki wyjściowe
my %uchwyt;
for my $adres (@skrzynki) {
# ale jak się nie da zapisywać, to pora umierać
open $uchwyt{$adres}, '>', "$output/$adres" or die;
}
# drugi przebieg
for my $nazwa (glob $logi) {
open UCHWYT, $nazwa or next;
while(<UCHWYT>) {
if(m/:\s([0-9A-F]{10}):\s/ && $qid{$1}) {
# linia zawiera jeden z szukanych queue-id
# wypiszemy ją do właściwego pliku
print {$uchwyt{$qid{$1}}} $_;
}
}
close UCHWYT;
}
# zamykamy pliki wyjściowe
for my $adres (@skrzynki) {
close $uchwyt{$adres};
}
exit 0;
(tak, mam pilną robotę, zupełnie niezwiązaną z Perlem, a bo co?)
--
Szymon Sokół (SS316-RIPE) -- Network Manager B
Computer Center, AGH - University of Science and Technology, Cracow, Poland O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein H
Technical Details
Message-ID:
<1e9ldsaa3rl1d$.dlg@falcon.sloth.hell.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!dustpuppy.sloth.hell.pl!not-for-mailReferences:
<idbb3m$dpe$1@inews.gazeta.pl> <idghvm$7d6$1@inews.gazeta.pl> <idjfvc$ksa$1@news.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!dustpuppy.sloth.hell.pl!not-for-mail
From: Szymon Sokół
<szymon@bastard.operator.from.hell.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: problem logiczny ze skryptem
Date: Mon, 6 Dec 2010 22:25:54 +0100
Organization: Guy Fawkes Society
Lines: 91
Sender: szymon@news.agh.edu.pl
Message-ID: <1e9ldsaa3rl1d$.dlg@falcon.sloth.hell.pl>
References: <idbb3m$dpe$1@inews.gazeta.pl> <idghvm$7d6$1@inews.gazeta.pl> <idjfvc$ksa$1@news.onet.pl>
NNTP-Posting-Host: 89-78-159-131.dynamic.chello.pl
Mime-Version: 1.0
X-Trace: news.agh.edu.pl 1291670845 10972 89.78.159.131 (6 Dec 2010 21:27:25 GMT)
X-Complaints-To: abuse@agh.edu.pl
NNTP-Posting-Date: Mon, 6 Dec 2010 21:27:25 +0000 (UTC)
User-Agent: 40tude_Dialog/2.0.15.1 Hamster/2.1.0.11
X-Face: xic?6f"rD)k-tM.]L]A6l4W7_aGt({}&{D,hiRI.8cPtf,1F.w@Qkl!vr23o1UY-BfXO$p< hk5>ijB?eBy)?!C<@)+%U\&`1X)MJ>.i.qgkY]4mvL62j<|xJRG/5:7:l8q]x;v!)Bz^r/!yG8DxoD -@fnC,g]BAXj
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit