1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor:...

23
1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito Asta Tutor: Ing. Paolo Molinari

Transcript of 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor:...

Page 1: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

1

Corso di

IMPIANTI DI ELABORAZIONE

Seminario:

Una panoramica sul PERL

Docente: Ing. Vito Asta Tutor: Ing. Paolo Molinari

Page 2: 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

Page 3: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

3

STRUTTURA DI UN PROGRAMMA

#! /usr/bin/perl -wincludeBODYfunctions definitions

NON NECESSARIE:• dichiarazioni prototipi• dichiarazioni variabili e tipi

Ma comunque preferibili

(use strict)

Page 4: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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”;}

Page 5: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

5

TIPI DI DATI

• scalar

• array

• hash (associative array)

reference

• Minimo controllo• Conversioni automatiche• Concetto di “no unnecessary limits”

Page 6: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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

Page 7: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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

Page 8: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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 @

Page 9: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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)

Page 10: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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)

Page 11: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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’)

Page 12: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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 %

Page 13: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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’};

Page 14: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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

Page 15: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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

Page 16: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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

Page 17: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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.

Page 18: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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)

Page 19: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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) {…}

Page 20: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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++;

}

Page 21: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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";

Page 22: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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";

}}

Page 23: 1 Corso di IMPIANTI DI ELABORAZIONE Seminario: Una panoramica sul PERL Docente: Ing. Vito AstaTutor: Ing. Paolo Molinari.

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);}