PcPedia >> non subire l informatica!

  • Increase font size
  • Default font size
  • Decrease font size
  • default color
  • black color

PERL

E-mail Stampa PDF

 

Il perl è un linguaggio di scripting nato per l'elaborazione di grandi quantità di testo ma poi evolutosi ulteriormente: l'origine del suo nome sta infatti per “Practical Extraction and Report Language”.

 

La differenza principale con uno script di shell in perl è che l'interprete del perl analizza completamente il programma prima di eseguirlo.

 

  • Filehandle del Perl

 

 

Come ogni processo UNIX, anche il perl possiede i tre filehandle (STDOUT, STDERR, STDIN). Alcuni comandi come print utilizzano di default il terminale come standard output: 

print “Scrivo sul terminale \n”;# è analogo a:

print STDOUT “Scrivo sul terminale\n”;# possiamo anche prelevare l'output di STDIN e metterlo su STDOUTwhile (<STDIN>){print STDOUT;}# ogni cosa che scrivo con la tastiera viene messa su schermo

 

L'operatore < > ossia maggiore-minore (o NULL) consente di trarre l'input da STDIN o da un file sulla linea di comando.

while (<>){print;}     # è una specie di cat

 

 

 CREAZIONE DI UN FILEHANDLE:

 

 

 

Supponiamo che la variabile filename contenga il percorso di un file:

 open (FILE,$filename);|| die “non posso aprire $filename”;# se esiste $filename apre il filehandle FILE 

 Di default open apre un file in sola lettura (<), ma è possibile aprirlo in scrittura (>), lettura e scrittura (+>), accodamento (>>).

open (FILE,”> $filename”);|| die “non posso aprire $filename”; # lo apre in scrittura...

# è possibile aprire un filehandle pipe di input o output# se nella shell si usava ls|wc-l per contare i file in perl:

open (INP,”ls |”);while (<INP>) {++$files;}print “ci sono $files nella directory\n”  # per ls|wc|mail $adress vediamo un altro esempio

open (INP,”ls |”);open (OUT,”| mail $adress”)while (<INP>) {++$files;}print OUT “ci sono $files nella directory\n” 

 

  • Variabili del Perl

VARIABILI SCALARI 

 

Come si è già potuto notare, le variabili scalari sono precedute dal simbolo del dollaro $.

Esse assumono il significato di stringhe o valori numerici a seconda del contesto in cui appaiono.

 print “Scrivi una variabile”;$var= <STDIN>chop $var;print “la tua variabile è $var\n”; 

La funzione  chop taglia l'ultimo carattere di una stringa per eliminare il riorno a carrello (l'invio.. altrimenti sarebbe andato a capo da solo senza \n ..).

Da notare che chop, se non viene specificato nessun argomento, opera su $_ . La variabile $_ entra in gioco molto spesso, a volte senza che il programmatore se ne occupi: infatti è usata come variabile di default in moltissimi comandi (ad esempio  in chop, con l'operatore diamante, con print etc..) 

 

 ARRAY

 

Gli array vengono preceduti dal simbolo @ . 

 

# definire un vettore anche con variabili miste è immediato:

@vettore = (1,4.5,”marco”,”ciao”,$var)# anche richiamarlo è molto semplice:

print “ecco il vettore completo: @vettore \n”print “ecco il terzo elemento: $vettore[2] \n”

# e per sapere il numero di elementi che lo compongono:

print “è composto da $#vettore elementi\nprint “ed il minimo indice è $[vettore” 

Per richiamare una componente del vettore si usa il simbolo dollaro essendo essa una scalare... Un array molto importante è @ARGV: esso contiene i parametri digitati sulla linea di comando.  

 

NOTA: USO DI FOREACH: 

L'istruzione foreach viene utilizzata per scorrere un array ed assegnarne ad una variabile i diversi elementi, uno dopo l'altro: 

 foreach $var (0 .. $#ARGV){print “l' elemento $var è $ARGV[$var]\n”; }

# la variabile $var assume valori da zero al numero di elementi

# dell' array.L'array in questione è @ARGV Riscriviamo questo esempio usando una delle funzioni della variabile $_: 

foreach(0 .. $#ARGV){print “l' elemento $var è $ARGV[$_]\n”; }

# non serve più la $var poiché di default $_ prende il suo posto   

 

 

OPERAZIONI CON GLI ARRAY

 

 

 

L'operatore shift elimina il primo elemento dell' array e quindi sposta “verso sinistra” tutto il suo contenuto restituendo l'elemento eliminato.

Unshift aggiunge uno o più elementi all'inizio dell'array e restituisce il numero di elementi totali.   @vettore = (1,4.5,”marco”,”ciao”,100)$memo = shift (@vettore)

# ora @vettore =(4.5,”marco”,”ciao”,100) e $memo=1

$memo2 = unshift (@vettore,”agg”)

# ora @vettore =(agg,4.5,”marco”,”ciao”,100) e $memo2=5 

Gli analoghi operatori pop e push si occupano degli spostamenti “verso destra” degli elementi: 

@vettore = (1,4.5,”marco”,”ciao”,100)$memo = push (@vettore,”bello”,”brutto”)

# ora @vettore =(4.5,”marco”,”ciao”,100,bello,brutto) e $memo=6

$memo2 = pop(@vettore)

# ora @vettore =(4.5,”marco”,”ciao”,100,bello) e $memo2=brutto 

 

Accenniamo anche agli operatori sort e reverse che si occupano di ordinare secondo la tabella ASCII i vettori: 

@numeri = (50,12,4,23,44,33,456);@ordinati=sort (@numeri);print “@ordinati”;

#Attenzione il nuovo ordine non è numerico:(12 23 33 4 44 456 50) 

 

 Il comando split suddivide una stringa in base ad un dato modello, mentre join concatena una serie di stringhe.

 @campi = split (/:/,$linea)

 # se $linea è una linea del file passwd, tramite questo comando

# creiamo un array contenente i vari record # per ricostruire tali record basta usare join:

$line = join (':',@campi) 

 

 L'operatore grep del perl è simile a quello di shell ,ma può compiere azioni aggiuntive ed usare i test sui file:  

@vettore = (1,4.5,”marco”,”ciao”,100);@num = grep(/[0-9]/,@vettore);

# @num diventerà (1,4.5,100)# ma grep può anche compiere delle operazioni aritmetiche:

@numperdue = grep (($_ *= 2),@num);  # che diventa (2,9,200)

 

Il comando splice ( ) viene utilizzato per la manipolazione degli array, esso ha una sintassi del tipo:            

splice (LIST, OFFSET,LENGHT,LIST) 

Prende come argomento dall'elenco LIST, e restituisce gli argomenti rimossi; lenght indica su quanti valori agire a partire dall'offset: questi possono essere opzionali. 

@vettore = (4.5,”marco”,”ciao”,100)splice (@array,0,0,”agg1”)

# è analogo a $memo2 = unshift (@vettore,”agg”) 

@vett = (“uno”,”due”,”otto”,”sette”,”cinque”)@vecchi = splice (@vett,2,2,”tre”,”quattro”);

# abbiamo sostituito otto e sette con tre e quattro

# si noti che si conta gli offset da zero;# per ricostruire il vettore originale:

splice (@vett,2,2,@vecchi); 

 

 

HASH o ARRAY ASSOCIATIVI

 

 

Un array associativo utilizza una stringa precedentemente definita (chiave) per la sua ricerca. In perl si indica con il simbolo percentuale (%): 

%auto = ('marca','modello','porte','colore');  # se volessimo assegnargli un valore:

$auto{'marca'} = 'fiat';# o tutti i valori in una volta si usa la virgola o =>:

%auto = ('marca'=> fiat,'modello'=>punto,'porte'=>3,'colore'=>blu)print “la marca dell'auto è $auto{'marca'}\n”; 

L'operatore keys produce un elenco delle chiavi ossia serve a stampare ogni chiave dell'array associativo e può essere ad esempio sfruttato cosi': 

foreach $var (keys(%auto)){print “la chiave $var è $auto{$var}”;}

# l'ordine di output di keys è imprevedibile e disordinato...

 

L'operatore affine values restituisce ovviamentr tutti i valori del vettore...mentre each ritorna la coppia chiave-dato. Il seguente è uno script che rende evidente la comodità dell'uso degli hash: 

while ( <> ) {     # prende in ingresso e mette in $_     

@linea=split (/\s/, $_); # array linea composto da parole     

foreach $parola (@linea){ # per ogni parola incrementa             

$parole++;           #i due contatori             

$conta{$parola}++;}}foreach $parola (sort keys(%conta)) { # riordina..       

print “ $conta{$parola}  $parola\n”; # ..e stampa tutto}

print “In totale trovate $parole parole\n\n”;

 

 

 

VARIABILI PREDEFINITE

 

 

Come gli script di shell, anche perl possiede delle utilissime variabili predefinite:

 

$$               PID del programma      

$<               UID reale dell'utente        

$>               UID effettivo dell'utente        

$?               stato dell'ultima chiamata        

$_              argomento predefinito        

$0               nome del programma        

$”               separatore di lista        

$/                separatore di righe per l'imput 

 


  • Operatori di corrispondenza modelli


  Perl ha riunito, migliorato e semplificato le stesse funzioni delle utility di shell (sed,grep,awk) e le espressioni regolari che utilizza sono pressoche analoghe.

 $pattern = shift @ARGV;while (<>) {     

print if (/$pattern/); # sottointeso if $_ ...

} 

E' evidente che questo script è una specie di grep. Il primo parametro di ingresso è l'espressione regolare, quelli seguenti sono i file da analizzare riga per riga. 

Assieme al modello  /espressione/ si usa  l'operatore di corrispondenza  =~ ogni volta che si desidera verificare la presenza di un modello in una variabile diversa da da $_. 

print “nome?”;chop ($name =<STDIN>)   #tutto in uno... è molto più elegante...

if ($name =~ /marco$/i) blablabla# notiamo l'uso di //i ossia ignora maiuscolo-minuscolo

# ed il simbolo $ ossia ancora la parola a fine riga# ma queste fanno parte delle espressioni regolari che vedremo..   

 

 

  • Operatori per stringhe

 

 

L'operatore punto ' . ' serve a concatenare due stringhe mentre l'operatore ' x ' ha la funzione di ripetere delle stringhe, per esempio: 

$nomeintero=$nome.” “.$cognome;$print “ciao “ x 100;#stampa cento volte la stringa ciao

 

Ricordiamo velocemente anche i seguenti semplici operatori:

 

lenght:                 misura la lunghezza di una stringa

reverse:                inverte una stringa

index, rindex:      trovano la posizione della prima e dell'ultima occorrenza.

 

$frase=“la posizione delle parole è una posizione”$pos1=index($frase,”posizione”);

$pos2=rindex($frase,”posizione”);   #quindi pos1=3 e pos2=33

 

L' operatore substr puo' sia estrarre che inserire stringhe ed ha la seguente forma: substr (ESPR, OFFSET, [LUNGHEZZA])

 

 

 

 


Sostenete il rinnovamento del sito dando un'occhiata ai link pubblicitari che vi interessano.
Commenti
Nuovo Cerca
+/-
Commenta
Nome:
Email:
 
Website:
Titolo:
UBBCode:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:D:angry::angry-red::evil::idea::love::x:no-comments::ooo::pirate::?::(
:sleep::););)):0
 
Please input the anti-spam code that you can read in the image.

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."