1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari
2 (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
3 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)
4 Esempio: #! /usr/bin/perl print “Come ti chiami?”; $name = ; chomp($name); if ($name eq ‘Paolo’) { print “Sei il tutor di Impianti\n”; } else { print “Non ti conosco!!!\n”; }
5 TIPI DI DATI scalar array hash (associative array) reference Minimo controllo Conversioni automatiche Concetto di “no unnecessary limits”
6 TIPI DI DATI: scalar 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 (Rappresentazione di NUMERI e STRINGHE) Le variabili si indicano con il prefisso $ Conversione automatica dipendente dal contesto (operando) Interpolazione di scalari in stringhe
7 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
8 TIPI DI DATI: array LITERAL: lista indicizzata di scalari (6, 7, pippo) (2, $temp) OPERATORI: assegnazione FUNZIONI: push, pop, unshift, shift, reverse, sort, chomp Gestione dinamica ed automatica della dimensione. Le variabili si indicano con il
9 Esempi di = ( );# array vuoto (dimensione = (1, 2, 3, 4, 5, 6, 7, 8, 9, = = (‘Luca’, ‘Giacomo’, = qw( Luca Giacomo = = 11, 12, 13); $len 10 ($len) (10)
10 Esempi di = (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];# Slice, (3, 4) ($a, $b) = ($temp[1], $temp[4]);# $a= 2, $b=4, (2, 4)
11 Esempi di = qw( pippo pluto qui quo); $value = ‘qua’; $value);# (‘pippo’, ‘pluto’, ‘qui’, ‘quo’, ‘qua’) (‘pippo’, ‘pluto’, ‘qui’, ‘quo’) ‘minnie’);# (‘pippo’, ‘pluto’, ‘qui’, ‘quo’) (‘quo’, ‘qui, ‘pluto’, qw(qui pluto quo pippo); (‘pippo’, ‘pluto’, ‘qui’, ‘quo’)
12 TIPI DI DATI: hash LITERAL: non esiste una rappresentazione dedicata; vengono visti come array FUNZIONI: keys, values, each, delete simile all’array scalari al posto degli indici non esiste ordinamento fra i suoi elementi array associativi Le variabili si rappresentano con il prefisso %
13 Esempi: %anagrafica = (‘nome’ => ‘Mario’, ‘cognome’ => ‘Rossi’, ‘eta’ => 52 ); $nome = $anagrafica{‘nome’};# Mario $eta = $anagrafica{‘eta’}# = %anagrafica; # (‘nome’, ‘Mario’, ‘cognome’, ‘Rossi’, ‘eta’, 51) %anagrafica = qw( nome Angelo cognome Branduardi eta = keys %anagrafica;# (‘nome’, ‘cognome’, ‘eta’) $numero_chiavi = keys %anagrafica;# in contesto = values %anagrafica;# (‘Angelo’, ‘Branduardi’, 55) delete $anagrafica{‘nome’};
14 REFERENCE Costrutti per allocare memoria (malloc, calloc,…) puntatori Sintassi per creare strutture dati anonime reference CPERL 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
15 Esempi di ref. e deref.
16 Strutture anonime ed annidate Si crea un puntatore senza partire da variabili già esistenti $ra = []; $rh = {}; Non sono realizzabili esplicitamente (array ed hash contengono solo scalari!) Ma i reference sono scalari e puntano a tutti gli altri tipi Uso dei reference per la realizzazione delle strutture annidate
17 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.
18 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: \%info)
19 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 { … }
20 Esempio: $count = 0; while(chomp($input = ) and $count<10) { if($input eq 'n') { next; # riavvia il ciclo, ovvero riparte da while() } $log[$count] = $input; $count++; }
21 $count = 0; while(chomp($a = )) { 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; $count++; } print
22 %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"; }
23 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 { $somma += $valore; } return }