🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #52093

Re: problem logiczny ze skryptem

#52093
From: Szymon Sokół
Date: Mon, 06 Dec 2010 21:25
91 lines
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-mail
References: <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