|
Iniziamo con i commenti su una serie di "pillole", a cura di Perl.it, che appariranno su Computer Programming a partire da questo mese. Si tratta di brevi articoli che spiegano come risolvere problemi specifici, o illustrano qualche particolare tecnica di programmazione. La prima pillola è dedicata agli one liner, ed è di Giuseppe Maxia, conosciuto da molti semplicemente come gmax.
Oneliner, che passione!
L'esperienza di Perl può nascere da una lunga pratica di programmazione, come in qualsiasi linguaggio, e questo è il tipo di esperienza risultante da molte ore seduto alla tastiera a comporre un sito web o un'applicazione di statistica. Ma c'è anche un'altra categoria di utenti che diventano esperti di Perl senza essere necessariamente dei programmatori di professione. Sto parlando degli amministratori di sistema, e fra questi includo anche quegli utenti che si trovano a dover fare un lavoro ripetitivo e, spronati dalla pigrizia scientifica, si ingegnano a trovare il modo di eseguire il compito velocemente e senza soffrire.
Gli adepti di questa branca di programmazione parallela sono tutt'altro che sprovveduti, e poiché conoscono il valore della brevità, si specializzano in quelle parti del linguaggio che abbrevia la quantità di codice scritto. I loro primi script, come quelli di chiunque altro, si estendevano per decine, talora centinaia di righe. Ma gli amministratori sono persone che riescono a trovare le scorciatoie in tutti gli aspetti del mestiere. Ecco che, dopo qualche settimana di script efficaci ma lunghetti, arriva il momento in cui si trovano a inserire istruzioni Perl direttamente dalla riga di comando.
Per esempio, dobbiamo estrarre da un file tutte le righe comprese fra gli indicatori INIZIO e FINE, a prescindere dalla posizione di tali indicatori nel file e dal numero di righe incluse:
Il comando:
perl -0ne 'print $1 if /^INIZIO$(.*)^FINE$/ms' nomefile
risponde alla richiesta, come pure l'alternativa:
perl -ne 'print if /^INIZIO$/ .. /^FINE$/' nomefile
che stampa le righe volute, includendo i due separatori.
Questi due distillati d'ingegno sfruttano alcune opzioni predefinite nel programma "perl":
- "-e" prende il parametro che segue e lo interpreta come una serie di istruzioni Perl.
- "-n" racchiude il codice suddetto all'interno di un ciclo "while" che legge il file passato come parametro, o lo standard input in sua assenza.
- "-0" (Zero, non O) legge il file tutto insieme, invece che riga per riga. Quindi i due esempi suddetti vengono interpretati da Perl in questo modo:
BEGIN { $/ = "\000"; $\ = undef; }
LINE: while (defined($_ = <ARGV>)) {
if (/^INIZIO$(.*)^FINE$/ms)
{
print $1
}
}
LINE: while (defined($_ = <ARGV>)) {
if (/^INIZIO$/ .. /^FINE$/)
{
print $_
}
}
Il resto è semplice applicazione di alcuni altri principi basati su espressioni regolari. "$1" è il risultato della ricerca effettuata, contenente tutti i caratteri fra le parentesi tonde. Nel comando alternativo, si usa l'operatore ".." per isolare un intervallo compreso fra due separatori.
Usando questi principi, è possibile costruire i propri one-liner (come familiarmente si chiamano questi gingilli) per risolvere una vasta gamma di problemi.
Inviato da arthas il 15.07.05 00:17
Ti è piaciuto questo articolo? Iscriviti al feed!
|