Perl, log irssi e lista di file

aprile 20, 2007

Pochi giorni fa, mentre chattavo in IRC, ho ricevuto un /query da un amico dove erano elencati diversi file. Io dovevo prendere questi file e poi farci un archivio. La parte dell’archivio è facile, basta un tar -cf archivio.tar * ed il gioco è fatto! ;-)

Ma la parte principale non è quella di fare l’archivio ma quella di prendere tutti i file. Vediamo ora come è fatto il log:
10:00 <nick> bbbb.txt
10:00 <nick> cccc.txt
10:01 <nick> dddd.txt

Da come si può vedere il log che ho salvato di irssi è formato prima dall’ora, poi dal nick (racchiuso tra parentesi angolari) e poi il testo (in questo caso i diversi nomi dei file).
Si può intuire quindi che dobbiamo eliminare la parte relativa all’ora, al nick ed anche lo spazio che sta prima del file.
Ora vediamo tutti i file che stanno nella nostra directory:
aaaa.txt
bbbb.txt
cccc.txt
dddd.txt
eeee.txt
ffff.txt
gggg.txt

I file aaaa.txt, eeee.txt, ffff.txt e gggg.txt non ci servono e quindi non li dobbiamo copiare.
Analizzato il problema, iniziamo a buttare giù lo script in Perl:

#!/usr/bin/perl

# script che pulisce un log e copia tutti i file di quella lista
# leot -> leonardo1990[at]gmail[dot]com - 17/04/2007

use File::Copy; # su Debian GNU/Linux pacchetto libfile-copy-recursive-perlmy

my $file = "logdiirssi.log"; # questo è il log...
my $dest = "dirdidest"; # directory di destinazione...

open(IRSSILOG, "$file") or die "Non riesco ad aprire il log irssi: $!";

while (<IRSSILOG>)
{
$_ =~ /<(.+)>\s(.+)/g;
copy($2, $dest) or die "Non riesco a copiare il file $!";
}

close IRSSILOG;

Tutte le righe precedute da un “#” sono dei commenti. Ogni variabile (scalare) è preceduto da un “$”. Lo script non è molto difficile, si commenta quasi da solo, l’unica riga un po’ ostica è forse la RegExp “/<(.+)>\s(.+)/g”. Questa espressione regolare non fa altro che catturare tutto ciò che sta dentro le parentesi tonde. La prima cattura finisce nella variabile $1, la seconda nella variabile $2. Quindi il nick lo troveremo in $1 mentre il file in $2.
Usando File::Copy possiamo copiare ogni file del log sulla directory di destinazione ($dest).
Questo script è stata la mia prima esperienza con il Perl e ne sono rimasto stupito dalle sue potenzialità! ;-)

Links utili:
http://www.perl.it/ Gruppo Perl Mongers Italia
http://pod2it.sourceforge.net/pods/perlintro.html
Piccola introduzione al Perl (perldoc perlintro)
http://www.perl.it/documenti/articoli/mb_corso_perl/mb_corso_perl.pdf Ottima introduzione

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: