🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
19 messages
19 total messages Started by gregor Fri, 03 Dec 2010 17:58
problem logiczny ze skryptem
#52081
Author: gregor
Date: Fri, 03 Dec 2010 17:58
64 lines
2119 bytes
Witam

Napisalem skrypt wyciagajacy z mailloga informacje o danym koncie email

tzn. kiedy sie logowal
i jaka byla sciezka mail queue (tzn. skad i dokad byl wysylany mejl)

#!/usr/bin/perl
$REGEXP = shift || die "nie podano adresu email / domeny";
$dir = '/usr/skrypty/maillog/boborowa';
@data = `/bin/cat $dir/maillog`;

my %Q;
my %line;

for (@data)
{
         if (/$REGEXP/i)
         {
             if (/([0-9A-Z]{10})/)
             {
                 $queue_id = $1;
             }
             if ($queue_id)
             {
                 $Q{$queue_id} = 1;
             }
             if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
             {
                  $line{$_} = $1;
             }
             $queue_id = "";
     }
}

# tu robie grep jeszcze raz dla maillog z konkretym ID queue i dopisuje 
do lini
foreach (keys %Q)
{
     @data = `/bin/cat $dir/maillog | grep $_`;
     foreach  (@data)
     {
         if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
         {
             $line{$_} = $1;
         }
     }
}


# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow

foreach my $id (sort keys %line)
{
     print $id;
}

no i pytanko jak to rozwiazac inaczej, moze ktos pisal skrypt na tego 
typu potrzeby

dzieki
gregor
Re: problem logiczny ze skryptem
#52082
Author: MaW
Date: Fri, 03 Dec 2010 18:13
31 lines
2223 bytes
Użytkownik "gregor" <gregor@szu.pl> napisał w wiadomości 
news:idbb3m$dpe$1@inews.gazeta.pl...
> Witam
>
> Napisalem skrypt wyciagajacy z mailloga informacje o danym koncie email
>
> tzn. kiedy sie logowal
> i jaka byla sciezka mail queue (tzn. skad i dokad byl wysylany mejl)
>


Nie bardzo rozumiem dwukrotnego grepowania.
W sendmailu zrobiłbym to tak:  dla maili wychodzących grepujesz raz, w pętli 
robisz dwie rzeczy:
Sprawdzasz czy jest to "From:", jesli tak to sprawdzasz nadawce i jesli 
pasuje  to zapamiętujesz w haszu: klucz to message-id, wartość dowolna
Jesli to jest linia zaczynająca sie od "to:   " - pobierasz message-id i 
sprawdzasz czy istnieje w haszu klucz o  takim message-id, jesli tak to 
wypisujesz from, to message-id, data, i kasujesz z hasza klucz message_id:
Algorytm bazuje na tym, że każdemu emailowi towarzyszą 2 linie - pierwsza o 
nadejsciu maila i wpadnieciu do kolejki, druga o dostarczeniu.
Na koncu wypisujesz hasza - będzie zawierał tylko maile niedostarczone

Jesli chcesz miec maile w drugą strone - w petli dodatkowo użyj drugiego 
hasza dla maili przychodzących Ale bedziesz musiał zapamiętywac każdego 
maila przychodzącego, Jeśli jednak zostanie dostarczony na inne lokalne 
konto - tylko skasujesz z hasza. Jeśli na interesujące - wypiszesz i 
skasujesz.

MaW 
Re: problem logiczny ze skryptem
#52083
Author: Kacper Perschke
Date: Fri, 03 Dec 2010 23:42
21 lines
1474 bytes
Dnia 03.12.2010 gregor <gregor@szu.pl> napisał:
> [...]

> Napisalem skrypt wyciagajacy z mailloga [...]

Dość luźne uwagi.

1) Domyślam się, że '/usr/skrypty/maillog/boborowa/maillog' to pojedynczy plik.
   Więc zamiast korzystać z shellowych cat i grep wczytaj cały plik do perla, a
   następnie przegrepuj w perlu.
2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu.

> no i pytanko jak to rozwiazac inaczej, moze ktos pisal skrypt na tego typu
> potrzeby

IMHO napisać to mniej enigmatycznie (z chęcią pomogę). Ja w ciągu 3 minut nie
byłem w stanie załapać z kodu algorytmu i zrezygnowałem.

KAcper
-- 
Mail => www.rot13.com
Re: problem logiczny ze skryptem
#52087
Author: hubert depesz lubaczewski
Date: Sat, 04 Dec 2010 09:44
12 lines
1205 bytes
On 2010-12-03, gregor <gregor@szu.pl> wrote:
> Napisalem skrypt wyciagajacy z mailloga informacje o danym koncie email
> tzn. kiedy sie logowal
> i jaka byla sciezka mail queue (tzn. skad i dokad byl wysylany mejl)

hmm .. czy to może jest log exima?

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: problem logiczny ze skryptem
#52084
Author: Adam Osuchowski
Date: Sun, 05 Dec 2010 12:39
17 lines
1720 bytes
Kacper Perschke wrote:
> 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu.

Jest to gdzieś powiedziane wprost w dokumentacji czy wnioskujesz po tym,
że nie jest powiedziane, że gwarantuje? Szczerze powiedziawszy jestem tym
trochę zaskoczony bo zawsze zakładam, że foreach iteruje w kolejności
indeksów i się nie spotkałem z przypadkiem, żebym się na tym zawiódł.

W sekcji ,,Foreach Loops'' manuala perlsyn nie ma wprawdzie tego jasno
powiedzianego, ale IMHO na zdrowy rozsądek, gdyby kolejność nie była
gwarantowana, to byłoby to jasno zaznaczone, gdyż logicznym jest, że
foreach powinien iterować po kolei i wielu programistów mogłoby się na
tym wyłożyć.

W tej samej sekcji jest natomiast przykład a'la C (for ze zmienną iteracyjną)
zestawiony jako tożsamy z foreach, co sugeruje, że jednak foreach idzie
w kolejności indeksu.
Re: problem logiczny ze skryptem
#52088
Author: gregor
Date: Sun, 05 Dec 2010 13:32
89 lines
2975 bytes
pisze jeszcze raz zmodyfikowalem nieco swoj skrypt ale "wisze" w jednym 
miejscu wlasnie w greepie bo musze jeszcze raz ten sam plik przeleciec 
greepem tak by powiazac ID kolejki z logami

to jest maillog - moze nie potrzebnie sie mecze i wogole jest juz taki 
skrypt co wyciaga wszelkie logi usera z mailloga samo danie cat /maillog 
| grep "adres@email" - nie dziala jak nalezy, dlatego pisalem ten skrypt 
ale dziala zbyt wolno


#!/usr/bin/perl
$dir = '/usr/skrypty/maillog/boborowa/logi';
$skrzynka = '';
my %Q;
my %line;

my %skrzynki = (
                     'biuro@xxx.pl' => 1,
                 );

# mam do obrobienia ok 300 plikow mailloga
for ($i=309;$i>=31;$i--)
{
open(UCHWYT, "$dir/maillog.$i");

while (<UCHWYT>)
{
#sprawdzam czy wpis jest emailem jesli tak to wchodzi dalej i sprawdza w 
haszu czy jest email jesli tak obrabia go dalej i tworzy linie
     if 
(/([\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/)
     {
         if ($skrzynki{$1})
         {
         if(!$skrzynka)
         {
             $skrzynka = $1;

         }
             if (/([0-9A-Z]{10})/)
             {
                 $Q{$1} = 1;
             }
             if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
             {
                  $line{$_} = $1;
             }
             $queue_id = "";
         }
     }
}
close UCHWYT;

# tu robie grep jeszcze raz dla maillog z konkretym ID queue i dopisuje 
#do lini i tu mam problem bo nie dziala mi odwolywanie sie do uchwytu

#np. robie
# $quee_id = $_;
# @data = grep {/$quee_id/i} <UCHWYT>;



foreach (keys %Q)
{
     @data = `/bin/cat $dir/maillog.$i | grep $_`;
     foreach (@data)
     {
         if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
         {
             $line{$_} = $1;
         }
     }
}
}


# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow
open ZAPISZ, "+>>$dir/wynik/$skrzynka";
foreach my $line (sort keys %line)
{
     print ZAPISZ $line;
}
close ZAPISZ;


dzieki za pomoc
gregor
Re: problem logiczny ze skryptem
#52089
Author: gregor
Date: Sun, 05 Dec 2010 17:26
76 lines
2601 bytes
OK jakos tam sobie poradzilem jak na moje umiejetenosci
moze sie komusc przyda chodzi przyzwoicie i ladnie zczytuje logi z postfixa

#!/usr/bin/perl

$dir = '/usr/skrypty/maillog/boborowa/logi';

#`/bin/rm -f $dir/wynik/*`;
#31 maillog
my %skrzynki = (
                     'biuro@xxx.pl' => 1,
                     'marketing@xxx.pl'        => 1,
                 );

foreach my $sprawdz (keys %skrzynki)
{
open ZAPISZ, "+>>$dir/wynik/$sprawdz";

for ($i=309;$i>=31;$i--)
{
open(UCHWYT, "$dir/maillog.$i");
open(UCHWYT_copy, "$dir/maillog.$i");
@UCHWYT = <UCHWYT_copy>;

my %Q;
my %line;

while (<UCHWYT>)
{
#sprawdzam czy wpis jest emailem jesli tak to wchodzi dalej i sprawdza w 
haszu czy jest email jesli tak obrabia go dalej i tworzy linie
     if 
(/([\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/)
     {
         if ($skrzynki{$1} && $sprawdz eq $1)
         {
             if (/([0-9A-Z]{10})/)
             {
                 $Q{$1} = 1;
             }
             if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
             {
                  $line{$_} = $1;
             }
             $queue_id = "";
         }
     }
}
close UCHWYT;

# tu robie grep jeszcze raz dla maillog z konkretym ID queue i dopisuje 
do lini
foreach (keys %Q)
{
     $id = $_;
     foreach (grep (/$id/, @UCHWYT))
     {
         print $_;
         if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/)
         {
             $line{$_} = $1;
         }
     }
}

# wyswietlam posortowane wpisy na podstawie godziny
# tu pojawia sie problem bo jak sortuje po godzinach to
# gubi sie kolejnosc wpisow
foreach my $line (sort keys %line)
{
     print ZAPISZ $line;
}
close UCHWYT_copy;
}
close ZAPISZ;
}
Re: problem logiczny ze skryptem
#52085
Author: Maciej Misiak
Date: Mon, 06 Dec 2010 19:32
26 lines
2214 bytes
W dniu 2010-12-05 13:39, Adam Osuchowski pisze:
> Kacper Perschke wrote:
>> 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu.
>
> Jest to gdzieś powiedziane wprost w dokumentacji czy wnioskujesz po tym,
> że nie jest powiedziane, że gwarantuje? Szczerze powiedziawszy jestem tym
> trochę zaskoczony bo zawsze zakładam, że foreach iteruje w kolejności
> indeksów i się nie spotkałem z przypadkiem, żebym się na tym zawiódł.
>
> W sekcji ,,Foreach Loops'' manuala perlsyn nie ma wprawdzie tego jasno
> powiedzianego, ale IMHO na zdrowy rozsądek, gdyby kolejność nie była
> gwarantowana, to byłoby to jasno zaznaczone, gdyż logicznym jest, że
> foreach powinien iterować po kolei i wielu programistów mogłoby się na
> tym wyłożyć.
>
> W tej samej sekcji jest natomiast przykład a'la C (for ze zmienną iteracyjną)
> zestawiony jako tożsamy z foreach, co sugeruje, że jednak foreach idzie
> w kolejności indeksu.

Z reguły się to mówi przy iterowaniu po kluczach albo wartościach hasha, 
więc pewnie Kacprowi chodziło o tą linijkę:

foreach (keys %Q)

-- 
grizzley
Re: problem logiczny ze skryptem
#52090
Author: Maciej Misiak
Date: Mon, 06 Dec 2010 20:10
82 lines
3531 bytes
Kilka uwag:
1. nie dostrzegam sensu dwa razy otwierania i czytania pliku do 
"$dir/maillog.$i". Jeśli tylko z niego czytasz i potem wykorzystujesz te 
dane na zasadzie read-only to wystarczy wczytać raz i skorzystać dwa razy.
2. dla lepszej czytelności można trochę pozmieniać kolejność żeby lepiej 
widoczne były bloki: otwórz plik, przeczytaj, zamknij plik
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?
4. w regexpie [a-zA-Z0-9_] możesz zamienić na \w. Generalnie do 
sprawdzania czy string jest emailem lepiej użyj jakiegoś gotowego 
Regexp::Common czy czegoś podobnego.
5. jeżeli /([0-9:]{3}[0-9:]{3}[0-9]{2})/ to jest regexp sprawdzający czy 
string jest godziną, to definitywnie wypadałoby zamienić na coś, co nie 
dopasuje '::::::01' ani '00000000'... Np. /(\d{2}:\d{2}:\d{2})/
6. if(w1) { if(w2) { } } lepiej zapisać jako if (w1 && w2) { }


Więc jakoś tak (bez testowania)

#!/usr/bin/perl

$dir = '/usr/skrypty/maillog/boborowa/logi';

#`/bin/rm -f $dir/wynik/*`;
#31 maillog
my %skrzynki = (
                     'biuro@xxx.pl' => 1,
                     'marketing@xxx.pl'        => 1,
                 );

open(UCHWYT, "$dir/maillog.$i");
@UCHWYT = <UCHWYT>;
close UCHWYT;

foreach my $sprawdz (keys %skrzynki)
{
	open ZAPISZ, "+>>$dir/wynik/$sprawdz";
	
	for ($i=309;$i>=31;$i--)
	{
		my @Q;
		my %line;
		
		for (@UCHWYT)
		{
		#sprawdzam czy wpis jest emailem jesli tak to wchodzi dalej i sprawdza 
w haszu czy jest email jesli tak obrabia go dalej i tworzy linie
		    if(/([\w\.-]*\w@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/
				&& $skrzynki{$1}
				&& $sprawdz eq $1)
		    {
		            if (/([0-9A-Z]{10})/)
		            	{ push @Q = $1 }
		            if (/(\d{2}:\d{2}:\d{2})/)
			            { $line{$_} = $1 }
		            $queue_id = "";
		    }
		}
		
		# tu robie grep jeszcze raz dla maillog z konkretym ID queue i 
dopisuje do lini
		for my $id(@Q)
		{
		    for (grep /$id/, @UCHWYT)
		    {
		        print;
		        if (/(\d{2}:\d{2}:\d{2})/)
		        	{ $line{$_} = $1 }
		    }
		}
		
		# wyswietlam posortowane wpisy na podstawie godziny
		# tu pojawia sie problem bo jak sortuje po godzinach to
		# gubi sie kolejnosc wpisow
		print ZAPISZ sort keys %line;
	}
	close ZAPISZ;
}

-- 
grizzley
Re: problem logiczny ze skryptem
#52091
Author: Mirosław Zalewski
Date: Mon, 06 Dec 2010 20:33
13 lines
1510 bytes
grudzień roku pamiętnego 2010, prawdopodobnie 06. Wielka mądrość na
czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak:

> 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?

Przecież to są ewidentnie pliki $dir/maillog.309, $dir/maillog.308 i
tak dalej do $dir/maillog.31. Pewnie po jakimś logrotate tyle ich jest.
-- 
Niżej podpisany, zamieszkały w http://minio.xt.pl ,
                       Mirosław Zalewski
Re: problem logiczny ze skryptem
#52092
Author: Maciej Misiak
Date: Mon, 06 Dec 2010 20:40
16 lines
1755 bytes
W dniu 2010-12-06 21:33, Mirosław Zalewski pisze:
> grudzień roku pamiętnego 2010, prawdopodobnie 06. Wielka mądrość na
> czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak:
>
>> 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?
>
> Przecież to są ewidentnie pliki $dir/maillog.309, $dir/maillog.308 i
> tak dalej do $dir/maillog.31. Pewnie po jakimś logrotate tyle ich jest.

A ok, no to cofam idiotyczny pomysł wyciągania przed pętlę :)

-- 
grizzley
Re: problem logiczny ze skryptem
#52093
Author: 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
Re: problem logiczny ze skryptem
#52094
Author: Szymon Sokół
Date: Mon, 06 Dec 2010 21:33
26 lines
2007 bytes
On Mon, 6 Dec 2010 22:25:54 +0100, Szymon Sokół wrote:

Po chwili namysłu - ten kawałek:

>     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;
>       }
>     }

przecież można zoptymalizować:

    if(m/:\s([0-9A-F]{10}):\s.*(?:from|to)=<($regexp)>/o) {
      # znaleziono jeden z szukanych adresów
      $qid{$1} = $2;
    }

-- 
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
Re: problem logiczny ze skryptem
#52097
Author: Kacper Perschke
Date: Mon, 06 Dec 2010 22:11
90 lines
3598 bytes
Dnia 05.12.2010 gregor <gregor@szu.pl> napisał:
> OK jakos tam sobie poradzilem jak na moje umiejetenosci moze sie komusc
> przyda chodzi przyzwoicie i ladnie zczytuje logi z postfixa

Brawo!

Jednka podobnie jak koledzy bym go dość mocno przerobił. Co ty na propozycję
wspólnego przerobienia? Jednak wtedy wolałbym zobaczyś kawałek takiego logu
i jeszcza raz usłyszeć algorytm nie w perlu tylko słowami w języku polskim.

- Na przykład - początek
Poniżej warunek '$skrzynki{$1} && $sprawdz eq $1' jest równoważny '$sprawdz eq $1'.
foreach my $sprawdz ( keys %skrzynki ) {
  if (/regexp/) {
    if( $skrzynki{$1} && $sprawdz eq $1 ){
    }
  }
}
- Na przykład - koniec

Postarałem się trochę go uładzić, ale mi się nie podoba co wyszło. Ja dalej w
tym nie widzę idei. Gdybym dostał taki kod po kimś to bym klął autora na czym
świat stoi. Koszt wejścia to minimum ze 45 minut.

- Kod - początek
#!/usr/bin/perl

my @office_emails = ( 'biuro@xxx.pl', 'marketing@xxx.pl', );
my $working_dir   = '/usr/skrypty/maillog/boborowa/logi';
my $logs          = read_logs();

foreach my $checked_email (@office_emails) {

    open ZAPISZ, "+>>$working_dir/wynik/$checked_email";

    for my $log_content (@$logs) {

        my %Q    = ();
        my %line = ();

        for my $log_line (@$log_content) {
            if ( $log_line =~
                 m/([\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/
              )
            {
                my $suspected_email = $1;
                if ( $suspected_email eq $checked_email ) {
                    $Q{$suspected_email} = 1
                      if (/([0-9A-Z]{10})/);
                    $line{$log_line} = $suspected_email
                      if (/([0-9:]{3}[0-9:]{3}[0-9]{2})/);
                }
            }
        }

        foreach my $id ( keys %Q ) {
            foreach my $sthg_terefere ( grep ( /$id/, @$log_content ) ) {
                print $id; # Debugging ???
                if ( $sthg_terefere =~ m/([0-9:]{3}[0-9:]{3}[0-9]{2})/ ) {
                    $line{$id} = $1;
                }
            }
        }

        foreach my $line ( sort keys %line ) {
            print ZAPISZ $line;
        }

    }

    close ZAPISZ;
}

sub read_logs () {
    my $logs = [];
    for ( my $log_no = 309 ; $log_no >= 31 ; $log_no-- ) {
        my $log_file_name = "$working_dir/maillog.$log_no";
        open( LOG_FILE, $log_file_name );
        my @log_file_content = <LOG_FILE>
          or die "Syplem sie na czytaniu logu $log_file_name";
        close(LOG_FILE);
        push @$logs \@log_file_content;
    }
    return $logs;
}
- Kod - koniec

KAcper
-- 
Mail => www.rot13.com
Re: problem logiczny ze skryptem
#52086
Author: Kacper Perschke
Date: Mon, 06 Dec 2010 22:16
21 lines
1696 bytes
Dnia 05.12.2010 Adam Osuchowski <someone@somewhere.com> napisał:
>> 2) foreach nie gwarantuje, że będzie szedł po liście w kolejności indeksu.

Przepraszam za wprowadzanie w błąd!

> Jest to gdzieś powiedziane wprost w dokumentacji czy wnioskujesz po tym,
> że nie jest powiedziane, że gwarantuje?

Wnioskuję po tym że nie jest powiedziane wprost iż gwarantuje.

> Szczerze powiedziawszy jestem tym trochę zaskoczony bo zawsze zakładam, że
> foreach iteruje w kolejności indeksów i się nie spotkałem z przypadkiem,
> żebym się na tym zawiódł.

Ja w sumie też nigdy się nie zawiodłem. Jak zaugerował Maciek Misiak
keys(%hash) ma prawo zwracać w dowolnej kolejności więc dmuchałem na zimne.
Choć ja dalej wolę pozostać przy moim dmuchaniu na zimne.

KAcper
-- 
Mail => www.rot13.com
Re: problem logiczny ze skryptem
#52095
Author: Kacper Perschke
Date: Mon, 06 Dec 2010 22:22
17 lines
1395 bytes
Dnia 06.12.2010 Szymon Sokół <szymon@bastard.operator.from.hell.pl> napisał:
> [...]
> 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.
> [...]

Czyli wygląda, że ja zacząłem rzeźbić ten drugi. :D

> To byłoby jakoś tak:
> [...]

Podziwiam Cię drugi raz w życiu.

KAcper
-- 
Mail => www.rot13.com
Re: problem logiczny ze skryptem
#52061
Author: Szymon Sokół
Date: Tue, 07 Dec 2010 09:12
13 lines
1668 bytes
Kacper Perschke <zbp.yvnzt@rxupferc.ercpnx> wrote:
> Podziwiam Cię drugi raz w życiu.
Dopiero drugi? No rozczarowany jestem... ;->

A ten program pewnie dałoby się jeszcze trochę ulepszyć, np. zamiast listy
adresów na sztywno wpisanej w kodzie (@skrzynki) używać @ARGV. Ale to już
banalna zmiana.

-- 
Szymon Sokół (SS4004,SS316-RIPE) -- Network Manager                          B
Computer Center, University of Mining and Metallurgy, Cracow, Poland.        O
http://2510053385/~szymon/      PGP key id: RSA: 0x61094A7D, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: problem logiczny ze skryptem
#52096
Author: Maciej Misiak
Date: Thu, 09 Dec 2010 00:09
15 lines
1716 bytes
W dniu 2010-12-06 22:25, Szymon Sokół pisze:
> 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.

Czasami trzeba to powiedzieć wprost: ja jestem tylko Misiem o bardzo 
małym rozumku... :)

-- 
grizzley
Re: problem logiczny ze skryptem
#52098
Author: gregor
Date: Sat, 11 Dec 2010 17:30
4 lines
1061 bytes
dzieki Panowie wszystkim za pomoc, na pewno sugestie na przyszlosc 
zastosuje, wiedzialem, ze uzyskam fachowa pomoc :)

gregor
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads