Note Perl

Ci sono tre tipi di variabili in PERL: HASH, ARRAY e SCALAR;
Gli array utilizzati in un contesto scalare restituiscono il numero del massimo indice +1.
Le liste in un contesto scalare restituiscono l’ultimo elemento.
Le liste e gli array possono essere forzate per essere usate in un contesto scalare usando l’operatore scalar(array o list);

L’operatore quote words, “qw”, restituisce sempre un array.

Operatori relazionali numerici

l < r r ? maggiore di l l > r l ? maggiore di r
l = r l ? maggiore o uguale a r
l == r l e r sono uguali ( hanno lo stesso valore )
l != r l e r non sono uguali ( non hanno lo stesso valore )
l r restituisce false ( -1 ) se l ? minore di r, true ( 1 ) se l ? maggiore, false ( 0 ) se l ? uguale

 Operatori relazionali stringa

l lt r -
l gt r -
l le r -
l ge r -
l eq r -
l ne r -
l cmp r -

 Operatori logici ( vengono usati in espressioni multiple )

&& o and ( AND ), || o or ( OR ), ! o not ( NOT ), ^ o xor ( XOR )

Operatore ternario ( condizione?istruzioniTrue:istruzioneFalse; )

Operatore virgola ( , ) o operatore implica ( => )

L’operatore virgola usato in un contesto scalare e di tipo lista restituisce l’ultimo elemento della lista, in un contesto lista restituisce tutti gli elementi.

 Operatori a bit

& (AND ) print 5 & 3;
00000101
& = 00000001
00000011

| ( OR ) print 5 | 3;
00000101
| = 00000111
00000011

^ ( XOR ) print 5 ^ 3;
00000101
^ = 00000110
00000011

~ ( NOT ) print ~5;
~ 00000101 = 11111010

<< ( Left Shift ) print 5 << 3; // Sposta tre bit a sinistra 00000101 << = 00101000 00000011 >> ( Right Shift ) print 5 >> 3; // Sposta tre bit a destra
00000101
>> = 00000000
00000011

Istruzioni condizionali

Istruzione if:
if( condizione) { // se ( condizione )
istruzioni;
} elsif( condizione ) {
istruzioni;
} else {
istruzioni;
}

Istruzione unless:
unless( condizione ) { // se non ( condizione ), se ? falsa
istruzioni;
} elsif ( condizione ) {
istruzioni;
} else {
istruzioni;
}

Istruzioni abbreviate:
istruzionE unless condizione;
istruzionE if condizione;

Istruzioni di loop

for:
for(inizializzazione; condizione; re-inizializzazione) {
istruzioni;
}

foreach:
foreach $var (list o array) {
istruzioni;
}

while:
while(condizioneVera) {
istruzioni;
} continue {
istruzioni; // Viene svolta ad ogni iterazione del ciclo
}
Come ottenere tutte le variabili d’ambiente:

while(($chiave, $valore)=each(%ENV)) {
print STDOUT “$chiave => $valore”;
} continue {
print STDOUT “\n”;
}

until:
until(condizioneFalsa) { // Fimch? ? falsa
istruzioni;
} continue {
istruzioni;
}

do…while:
do {
istruzioni;
while(condizione);

Istruzione abbreviate:
istruzione while(condizione);
istruzione while(condizione);

Istruzioni last, redo, next

last label; // Termina il ciclo equiavala a break di PHP, anche se in PHP il label viene espresso con un numero
redo label; // Rivaluta il codice del blocco senza verificare la condizione
next label; // Passa al ciclo successivo

Etichette

ETICHETTA: while(condizione) {
istruzioni;
}

 Gestione script

die(string errore); // Esce immediatamente dallo script e genera un messaggio di errore, se non specificato viene usata quello della variabile $!
warn(string errore); // Non esce dallo script ma genere un messaggio di errore
exit(int num=1 o 0); // Esce immediatamente dallo script, 1 se in caso negativo e 0 in caso positivo

 Array e Hash

La differenza sostanziole tra array e hast ? l’indice. Nelle array gli indici sono numerici, negli hash gli indici sono di tipo stringa.
Definizione di un array:
@array=(“ciao”, “come”, “stai”, “?”);
$array[4]=”Io bene”;
$,=” “;
print @array;

Definizione di un hash:
%hash=(“chiave1″=>”Come”, “chiave2″=>”stai”, “chiave3″=>”?”);
$hash{“chiave3″}=”Io bene”;
$,=” “;
print %hash;

Esempio:
@letters=(“A”, “E”, “M”);
@words=(“alligator”, “elephant”; “monkey”);
foreach $i (0..2) {
$dictionary{$letters[$i]}=$words[$i];
}
$,=” “;
print %dictionary;

Subroutine

Esempio di definizione:

sub nomeSubroutine {

}

Passare parametri alle subroutine:

sub nomeSubroutine {
# @_
print $_[0];
}
nomeSubroutine(“Diego Santoro”);

Esempio completo:
sub nomeSubroutine($); # Prototipo di funzione, specifico il tipo di variabile da passare, scegli tra una o piu opzioni tra $, @, %
print(nomeSubroutine(“Diego”));
sub nomeSubroutine($) {
$nome=$_[0];
$cognome=$_[1];
$cognome||=” Santoro”; # Cosi specifico un valore di default per i parametri non passati, se si passa una stringa vuota o un zero verr? sostituito
print $nome;
return $cognome;
}

Un altro esempio:
sub Nome($$); # Oltre al tipo, bisogna specificare anche in ordine di sequenza i parametri passati

/> sub Nome($$) {
print $_[0];
print “\n”;
print $_[1];
}
Nome(“Diego”, “Michael”);

E’ possibile limitare lo scope delle variabili attraverso due funzioni my e local.
My rende le variabili visibili sono all’interno del blocco, local invece permette di creare variabili visibili anche alle subroutine chiamate nel blocco.
Esempio:
my $var=”ciao”;
my($var1, $var2)=(“ciao”, “come”);

Formato

$deptName=”Sales department”;
$address=”sales\@xyz.com”;

# Allora la chiocciola indica il segnaposto
# le virgolette che segueno la chiocciola indicano quanti caratteri in base al loro numero e l’allineamento
# < Allineano a sinistra # > Allineano a destra
# | Allineano al centro
format CONTACT=
To contact our: @<<<<<<<<<<<<<<<<<< $deptName E-mail us at: @<<<<<<<<<<<<<<<<< $address . $~=”CONTACT”; write;

 

Gestione dell’input da tastiera Per leggere le informazioni inserite da tastiera bisogna usare un filehandle definito dall’avvio dell’interprete PERL ( STDIN [ standard input ] ) ed un operatore chiamato operatore di input di riga. Esempio print while(;);

Differenza tra PHP e PERL per quanto riguarda le espressioni regolari

C’? una grande differenza tra PHP e PERL per quanto riguarda le espressioni regolari.
Sappiamo tutti che il PHP ha preso le migliori caratteristiche da alcuni linguaggi: PERL e JAVA.
Quando in PHP si lavora con le espressioni regolari bisogna ricordare che la stringa verr? passata al motore delle espressioni regolari, quindi bisogna far attenzione alle sequenze di escape di PHP e del motore. A differenza di PHP PERL non ha tutti questi problemi perch? il motore ? integrato gi? nel linguaggio.
Esempi:
$var=~/pattern/options;
$var=~m/pattern/options;
$var=~s/pattern/options;
$var=~tr/match list/replacement list/options; # Non ? possibile utilizzare le variabili nelle liste
Esempio: $var=~tr/mwps/MWP /;

Con tutti gli operatori per le espressioni regolari tranne che con tr ad ogni sotto pattern PERL crea un variabili speciale $1 o \1, PERL inizia a contare dal primo sotto pattern. I sottopattern sono racchiusi tra parentesi tonde. La prima variabili ? $1 o \1 e possono anche essere usati nello stesso pattern.

Creazione di un file e scrittura di un file

Per scrivere dati su un file > ( equivale a w+ di PHP )
Per aggiungere dati ad un file >>
Per leggere dati da un file < Per leggere e scrivere dati su un file +< Nuova linea in UNIX: \n Nuova linea in DOS: \r\n Per non far comparire due caratteri di avanzamento riga bisogna usare la funzione binmode. Lettura file: open FILE, “+;);
close FILE;

Lettura file:
open FILE, “lettura.txt”;
print $text while(read(FILE, $text, 1024));
close FILE;

Scrittura file:
open FILE, “+$1/g;
print $variabile;
close FILE;

Riferimenti

Ogni variabile occupa una posizione specifica in memoria.
In Perl ? possibile creare riferimenti cio? assegnare l’indirizzo di memoria di una variabile ad un altra.
Attraverso il backslash e il nome della variabile da referenziare \$var;
Si possono creare 6 tipi di riferimenti:
- rif. ad una variabile scalare
- rif. ad un array
- rif. ad un hash
- rif. ad una subroutine
- rif. ad un altro riferimento
- rif. ad un typeglob

Esempio di typeglob, provatelo:
$data=”Ciao, come stai?”;
@data=qw(ciao come stai ?);
*dati=*data;
print $dati;
print “\n”, $dati[0]

Per deferenziare, basta che si indica il tipo di variabile referenziata seguita dalla variabile che contiene il riferimento:

Esempio con variabili scalari:
$var=50;
$rifer=\$var;
$$rifer=60;
print $$rifer;

Esempio con array, provatelo:
@rif=qw(ciao come stai ?);
$ciao=\@rif;
print @$ciao[1]; # oppure $ciao->[0]

@rif2=(\@rif);
print(“\n\n”, @{$rif2[0]}[1]); # oppure $rif2[0]->[1]

Esempio con hash, provatelo:
%hash=(“eta” => 17, “nome” => “Pirateria”, “cognome” => “Informatica”);
@val=(\%hash);

print “Eta: “, %{$val[0]}->{“eta”}, ” – Nome: “, %{$val[0]}->{“nome”}, ” – Cognome: “, %{$val[0]}->{“cognome”};

Quindi riepilogando per deferenziare basta usare, questa sintassi:
op Che specifica la variabile referenziata {variabile che contiene il riferimento}

Esempio con typeglob:
$variabile=60;
$var=\*variabile;
*ciao=*$var;
print $ciao;

Oppure, una sintassi alternativa:
$variabile=60;
$var=\*variabile;
print ${*{$var}}; # Le parentesi graffe danno precedenza

Esempio con funzioni:
sub Nome($$);

sub Nome($$) {
print $_[0], ” “, $_[1];
}

$var=\&Nome;

print &{$var}(‘Pirateria’, ‘Informatica’); # oppure $var->(“Pirateria”, “Informatica”);

Esempio con altri riferimenti:
$var=50;
@var2=(\$var, “ciao”);
$var3=\@var2;
print ${${$var3}[0]}

Package

Un package contiene codice perl riutilizzabile.
Esempio di package:

package nomePackage;
BEGIN { # subroutine di inizializzazione
# codice
}

# codice
$variabile=”Variabile”;

END { # questa subroutine viene eseguita quando l’interprete interromper? l’esecuzione del package

}

return 1; # questa istruzione dischiara a perl che il package ? pronto per l’uso

Per utilizzare il package, basta richiederlo nello script

require fileName nomePackage;
print $nomePackage::variabile;

Modulo

Il modulo ? molto simile ad un package, per? quando viene usato in uno script non c’? bisogno di usare il nome del package con i due punti.
Inoltre un modulo a differenza di un package deve essere salvato con l’estensione .pm e usa a sua volta un modulo chiamato Exporter
Esempio:

package nomePackage;

BEGIN {
use Exporter();
@ISA=qw(Exporter);
@EXPORT=qw($author, sName); # puoi usare EXPORT_OK se non vuoi sovrascrivere qualche variabile del tuo script
}

local $author=”Pirateria Informatica”;

sub sName {
print($author);
}

Per usarlo basta inserire nello script:
use “nomeModule.pm”;
print($author, “\n\n”);
print sName;

Lista funzioni

oct( string valoreOttale );
hex( string valoreEsadecimale );
scalar( list o array ); // Con le liste resituisce l’ultimo elemento, con l’array restituisce il numero ( ATTENZIONE: no l’ultimo indice) dell’array
chop( string o array );
chomp( string o array );
length( string );
lc( string );
lcfirst( string );
uc( string );
ucfirst ( string );
split / pattern / string , int limit ;

string
sprintf( formatString, list );
substr ( string, int da=0, int quantiCaratteri, string sostituzione );
index ( string Stringa, string subString, int posizioneDaCuiIniziare );
rindex (string Stringa, string subString, int posizioneDaCuiIniziare );
rand( int num ); // Genera un numero casuale
int( mixed ); // Genera un numero intero a partire dal numero passato alla funzione
oct ( mixed );
hex ( mixed );
abs ( int num ); // Converte un numero negativo in un numero assoluto
undef( mixed variabile ); // Non definisce una variabile, puo essere usata anche per definire una variabile nulla
defined ( mixed variabile ); // Consente di determinare se una variabile ? definita
time(); // Restituisce un unix timestamp
localtime( time time() ); // Restituisce un array contenete la data e l’ora
times();
chr( int num ); // Restituisce il carattere ASCII ( American Standard Code for Information Interchange ) corrispondente
ord( char Carattere ); // Restituisce il numero ASCII corrispondente
eval( string stringaCodice ); // Valuta una stringa di codice PERL
eval { block };
eval; // Valuta il codice della variabile speciale $_, le variabili create con eval sono accessibili all’esterno almeno che non vengono definite con my o local0
wantarray(); // Restituisce true se la funzione in cui viene chiamata è stata chiamata in un contesto lista (true) e false se in un contesto scalare (false)
join( string Carattere, array ); // E’ l’equivalente di implode() di PHP
map( funzione, lista o array ); // Consente di applicare la funzione agli elementi della lista e restituisce un array con i ripsettivi valori
grep ( espressione ( pattern ) o carattere, array ); // Estrae elementi dall’array specificata in base all’espressione e restituisce un array
sort { $a condizione $b} array; // Per ordinare in ordine crescente: $a operatore relazionale $b, $b operatore relazionale $b
unshift( array, list ); // Aggiunge la lista all’inizio dell’array
shift( array ); // Rimuove un elemento dall’inizio dell’array
push( array, list ); // Aggiunge la lista alla fine dell’array
pop( array ); // Rimuove un elemente dalla fine dell’array
splice( array, int indice=0, int offset, list ); // Sostituisce elementi dall’array
keys( hash ); // Restituisce un array contente chiavi dell’hash
values( hash ); // Restituisce un array contente i valori dell’hash
each( hash ); // Restituisce chiave e valore dell’hash, da usare con un ciclo
boolean exists ( $hash{chiave} ); // Verifica l’esistenza di un elemento
delete( $hash{chiave} ); // Cancella un elemento
print( filehandle list ); // Invia le informazioni in output
printf( filehandle formatstring, list ); // Per la formattazione usa lo stesso formato della subroutine sprintf
exec( command ); // Esegue un comando si sistema, terminando uno script
system( command ); // Esegue un comando di sistema, sospendendo uno script
open( filehandle, filename ); // Apre un file o una connessione ad un altro programma
close( filehandle );
binmode( filehandle );
stat( string nomeFile ); // Restituisce 13 valori
select( filehandle ); // Specifica il filehandle predefinito
rename( string oldfilename, string newfilename ); // Rinomina un file ed ? anche possibile spostare un file in una directory, se specificata la cartella
unlink( list ); // Cancella un file

boolean mkdir( string nomeCartella, permessi ); // I permessi sono espressi in forma ottale 0777, il primo sette sta ad indicare le autorizzazioni per il proprietario, il secondo sette sta ad indicare le autorizzazioni per il gruppo del proprietario e il terzo sette sta ad indicare le autorizzazioni per gli altri utenti.

Ecco un esempio, un cartella con questa autorizzazione:
- rwx rw- r–
— 0
–x 1
-w- 2
-wx 3
r– 4
r-x 5
rw- 6
rwx 7

Il suo valore ottale ?: 0 764
boolean rmdir( string nomeCartella ); // Rimuove una cartella
chdir( string NomeCartela ); // Cambia la directory dove viene eseguito lo script in un altra

Leave a Reply