1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor:...
-
Upload
concetto-pizzi -
Category
Documents
-
view
215 -
download
0
Transcript of 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor:...
1
Corso di
IMPIANTI DI ELABORAZIONE
Seminario:
Una panoramica sul PERL
Docente: Ing. Vito Asta Tutor: 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 -wincludeBODYfunctions definitions
NON NECESSARIE:• dichiarazioni prototipi• dichiarazioni variabili e tipi
Ma comunque preferibili
(use strict)
4
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”;}
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\nprint “ciao\n” # visualizza ciao e un newline
$str = ‘pippo’;print ‘ciao $str’; # visualizza ciao $strprint “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 prefisso @
9
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)
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)
11
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’)
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’} # 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’};
14
REFERENCE
• Costrutti per allocare memoria (malloc, calloc,…)
• puntatori
• Sintassi per creare strutture dati anonime
• reference
C PERL
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.
SCALAR ARRAY HASH
$a = ‘pippo’ @array=(10, 20) %hash=(‘nome’=>’Mario, ‘eta’ => 20)
$rs = \$a $ra= \@array $rh= \%hash
$$a push(@$ra, 30);print $$ra[1]; #20print $ra->[1]; #20
print $$rh{‘eta’}; # 20print $rh->{‘eta’}; # 20
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 scalarie 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 tuttigli studenti, occorrerà definire un
array di reference ad anagrafiche come quella appena vista:push(@all_anagraf, \%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 (@array) {…}
20
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++;
}
21
$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; $count++;}print "array: @array";
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 arraymy $somma; # per default inizializza a 0
# per tutti gli elementi dell’arrayforeach $valore (@$ra) {
$somma += $valore;}
return ($somma/@len_array);}