Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito Asta Tutor: Ing. Paolo Molinari
(P)ratical (E)xtraction and (R)eport (L)anguage Linguaggio parzialmente compilato e parzialmente interpretato Ottima portabililtà Orientato alla manipolazione delle stringhe (espressioni regolari) e alla formattazione dell’output Orientato agli oggetti Disponibilità (freeware) su rete dell’interprete, di una completa documentazione e di una vasta libreria
STRUTTURA DI UN PROGRAMMA #! /usr/bin/perl -w include BODY functions definitions NON NECESSARIE: dichiarazioni prototipi dichiarazioni variabili e tipi Ma comunque preferibili (use strict)
Esempio: #! /usr/bin/perl print “Come ti chiami?”; $name = <STDIN>; chomp($name); if ($name eq ‘Paolo’) { print “Sei il tutor di Impianti\n”; } else { print “Non ti conosco!!!\n”;
TIPI DI DATI scalar array reference hash (associative array) Minimo controllo Conversioni automatiche Concetto di “no unnecessary limits”
TIPI DI DATI: scalar (Rappresentazione di NUMERI e STRINGHE) Rappresentazione interna solo in virgola mobile a doppia precisione OPERATORI: + - / * % Sequenza di caratteri di 8 bit 2 tipi di valori (LITERAL) ammissibili: ‘stringa’ oppure “stringa” OPERATORI: . x Le variabili si indicano con il prefisso $ Conversione automatica dipendente dal contesto (operando) Interpolazione di scalari in stringhe
Esempio: Print ‘ciao\n’ # visualizza ciao\n print “ciao\n” # visualizza ciao e un newline $str = ‘pippo’; print ‘ciao $str’; # visualizza ciao $str print “ciao $str”; # visualizza ciao pippo $x = 10; $y = --$x; print “risultato = “ . ($x + $y) # visualizza risultato = 19
TIPI DI DATI: array Le variabili si indicano con il prefisso @ LITERAL: lista indicizzata di scalari (6, 7, pippo) (2, $temp) OPERATORI: assegnazione FUNZIONI: push, pop, unshift, shift, reverse, sort, chomp Le variabili si indicano con il prefisso @ Gestione dinamica ed automatica della dimensione.
Esempi di assegnazione: @tmp = ( ); # array vuoto (dimensione 0) @tmp = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); @tmp = (1..10); @tmp = (‘Luca’, ‘Giacomo’, ‘Pino’); @tmp = qw( Luca Giacomo Pino); @tmp1 = @tmp; @tmp1 = (0, @tmp, 11, 12, 13); $len = @temp; # 10 ($len) = @temp; # (10)
Esempi di accesso: @temp = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); $x = $temp[2]; # 3 $x = $temp[99]; # undef $last_index = $#temp; # 9 $x = $temp[-3]; # 8 @temp2 = @temp[2,3]; # Slice, (3, 4) ($a, $b) = ($temp[1], $temp[4]); # $a= 2, $b=4, (2, 4)
Esempi di funzioni: @temp = qw( pippo pluto qui quo); $value = ‘qua’; push(@temp, $value); # (‘pippo’, ‘pluto’, ‘qui’, ‘quo’, ‘qua’) pop(@temp); # (‘pippo’, ‘pluto’, ‘qui’, ‘quo’) unshift(@temp, ‘minnie’); # (‘minnie’, @temp) shift(@temp); # (‘pippo’, ‘pluto’, ‘qui’, ‘quo’) reverse(@temp); # (‘quo’, ‘qui, ‘pluto’, ‘pippo’) @temp= qw(qui pluto quo pippo); sort @temp; # (‘pippo’, ‘pluto’, ‘qui’, ‘quo’)
TIPI DI DATI: hash array associativi simile all’array scalari al posto degli indici non esiste ordinamento fra i suoi elementi array associativi LITERAL: non esiste una rappresentazione dedicata; vengono visti come array FUNZIONI: keys, values, each, delete Le variabili si rappresentano con il prefisso %
Esempi: %anagrafica = (‘nome’ => ‘Mario’, ‘cognome’ => ‘Rossi’, ‘eta’ => 52 ); $nome = $anagrafica{‘nome’}; # Mario $eta = $anagrafica{‘eta’} # 52 @tutto = %anagrafica; # (‘nome’, ‘Mario’, ‘cognome’, ‘Rossi’, ‘eta’, 51) %anagrafica = qw( nome Angelo cognome Branduardi eta 55); @chiavi = keys %anagrafica; # (‘nome’, ‘cognome’, ‘eta’) $numero_chiavi = keys %anagrafica; # in contesto scalare @valori = values %anagrafica; # (‘Angelo’, ‘Branduardi’, 55) delete $anagrafica{‘nome’};
REFERENCE C PERL Costrutti per allocare memoria (malloc, calloc,…) puntatori Sintassi per creare strutture dati anonime reference int a, *p; &a; /* memorizza l’indirizzo di a */ p = &a; /* p punta ad a */ int b = *p; /* b e’ uguale ad a */ $a = ‘oggi’; \$a; # rappresenta l’indirizzo della variabile scalare $a $ar = \$a; # $ar punta a $a $b = $$ar; # $b vale ‘oggi’ Un reference è uno scalare che memorizza un indirizzo di memoria
Esempi di ref. e deref.
Strutture anonime ed annidate Non sono realizzabili esplicitamente (array ed hash contengono solo scalari!) Si crea un puntatore senza partire da variabili già esistenti $ra = []; $rh = {}; Ma i reference sono scalari e puntano a tutti gli altri tipi Uso dei reference per la realizzazione delle strutture annidate
Esempio di strutture annidate: Esempio di strutture annidate: vogliamo memorizzare tutti i fratelli di uno studente. %info = (‘nome’ => ‘Mario Rossi’, ‘eta’ => 21, ‘fratelli => [ {‘nome’ => ‘Lucio Rossi’, ‘eta’ => ‘15’ }, {‘nome’ => ‘Andrea Rossi’, ‘eta’ => ‘7’ } ] ) Il valore associato alla chiave ‘fratelli’ è un reference ad un array; gli elementi dell’array sono a loro volta reference ad hash.
Esempio di strutture annidate: come si costruiscono? La costruzione è implicita con il tipo di assegnazione via via effettuato. %hash1 = (‘nome’=> ‘Lucio Rossi’, ‘eta’, 15); %hash2 = (‘nome’=> ‘Andrea Rossi’, ‘eta’, 7); %info{“fratelli”} = (\%hash1, \%hash2); %info{“nome”} = “Mario Rossi”; %info{“eta”} = 21; Volendo eventualmente una anagrafica di questo tipo per tutti gli studenti, occorrerà definire un array di reference ad anagrafiche come quella appena vista: push(@all_anagraf, \%info)
STRUTTURE DI CONTROLLO if (expr) { … } else { unless (expr) { … } se expr è falsa if (expr1) { … } elsif (expr2) { } else { while (expr) { … } finché è vera, esce non appena è falsa until (expr) { … } for (expr_inz; test; re-init) { … } foreach $t (@array) { … }
Esempio: $count = 0; while(chomp($input = <STDIN>) and $count<10) { if($input eq 'n') next; # riavvia il ciclo, ovvero riparte da while() } $log[$count] = $input; $count++;
$count = 0; while(chomp($a = <STDIN>)) { if($a eq 'r') $a = 'ZZ'; print "redo\n"; redo; } elsif($a eq 'l') print "last\n"; last; elsif($a eq 'n') $count++; print "next\n"; next; $array[$count] = $a; print "array: @array";
%lovers = ( 'Romeo’ =>'Giulietta', 'Otello’ =>'Desdemona', 'Dante' =>'Beatrice'); ama(\%lovers); sub ama { my $rh = shift; foreach $lui (keys %$rh) $lei = $rh->{$lui}; print "$lui ama $lei\n"; }
FUNZIONI sub MediaAritmetica($) { my $ra = shift; # ra è reference ad array my $somma; # per default inizializza a 0 # per tutti gli elementi dell’array foreach $valore (@$ra) { $somma += $valore; } return ($somma/@len_array);