-+  Associazione
-+  Documenti
-+  Eventi
-+  Community
-+  Blog
-+  Link

Ottobre 2013

Dom Lun Mar Mer Gio Ven Sab
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Cerca






 

« Catalyst, si gira! | Home | qw/ Catalyst PBP / »

Oneliner, che passione!
15.07.05

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!

Inviato da gmax il 17.07.05 00:03

13 mesi!
Non male, considerando che l'articolo e' stato scritto come risposta a una deadline di una settimana!

Inviato da arthas il 17.07.05 13:27

In effetti c'è stato qualche problema, comunque cerchiamo di evitare la polemica... ;)

michele










Devo ricordare i dati personali?






D:
Sull'autore...
D:
La ML di Perl.it
Iscriviti! mongers@lists.perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
D:
Annunci Google