Perl: programmazione postmoderna e filosofia opensource ---- Michele Beltrame ---- Perl.It ---- Perl ---- NASA 1987 ---- Larry Wall ---- TMTOWTDI regular expression obfuscation one-liner multipiattaforma Perl 6 arriverà ---- /^\d+(?:\.\d+)?$/ ---- Bello ma... ---- Old ---- Modern Perl ---- TMTOWTDI ma... object oriented programming autobox programmazione funzionale CPAN Perl 5 è qui, Perl 6 arriverà community ---- *** 1 *** TMTOWTDI ma.. ---- Larry Wall: linguista ---- più modi per esprimere lo stesso concetto ---- Se esco ti porto con me Ti porto con me se esco Ti porto con me se non resto a casa ---- più modi per scrivere analogo codice ---- # così... if ( $lady eq 'Macbeth' ) { say 'Shakespeare girl'; } # o così... say 'Shakespeare girl' if $lady eq 'Macbeth'; # o così... say 'Shakespeare girl' unless $lady ne 'Macbeth'; ---- # OOP così... package Cane; use parent qw/Animale Peloso/; sub new($self, $args) { $self->{altezza} = $args->{altezza}; } ---- # ...o così package Cane; use Class::Std; use parent qw/Animale Peloso/; my %altezza; sub BUILD($self, $objID, $args) { $altezza{$objID} = $args->{altezza}; } ---- Espressività ---- Confusione ---- Recommended Way To Do It ---- != Only Way To Do It ---- package Cane; use Moose; extends 'Animale'; with 'Peloso'; has 'altezza' => { isa => 'Num', is => 'rw' } ---- Zucchero sintattico ---- class Cane extends 'Animale' with 'Peloso' { has 'altezza' => { isa => 'Num', is => 'rw' } } ---- *** 2 *** Object Oriented Programming ---- Moose ---- class Animale { has 'altezza' => ( isa => 'Num', is => 'rw' ); method vai(Str $luogo) { say "vado $luogo"; } } ---- my $animale = Animale->new({ altezza => 50 }); say $animale->altezza; # Eccezione $animale->altezza('sessanta'); $animale->altezza(60); ---- * before * after ---- class Cane extends Animale { has 'zampe' => ( isa => 'Num', is => 'rw', default => 4 ); after vai(Str $luogo) { say 'sulle mie ' . $self->zampe . ' zampe'; } } ---- my $cane = Cane->new(); $cane->vai('a cuccia'); vado a cuccia sulle mie 4 zampe ---- * around ---- class Gatto extends Animale { around vai(Str $luogo) { say 'invece'; $self->$orig('dove mi pare'); say 'perché sono un gatto'; } } ---- $gatto->vai('divano'); invece vado dove mi pare perché sono un gatto ---- * override + super * augment + inner ---- class Animale { method rincasa() { say 'torno '; inner(); say ' e dormo'; } } ---- class Gatto extends Animale { augment rincasa() { say 'sul divano'; } } ---- $gatto->rincasa(); torno sul divano e dormo ---- LISPy ---- * multimethods ---- class Lotta { use MooseX::MultiMethods; multi method v(Cane $p1, Gatto $p2) { say 'p1' } multi method v(Gatto $p1, Cane $p2) { say 'p2' } multi method v(Any $p1, Any $p2) { say 'pari' } } ---- my $lotta = Lotta->new(); $lotta->v($cane, $gatto); $lotta->v($gatto, $cane); $lotta->v($cane, $cane); p1 p2 pari ---- * roles ---- role Peloso { has 'peli' => ( isa => 'Num', is => 'rw', default => 2**40 ); } class Cane extends Animale with Peloso { has 'zampe' => ( isa => 'Num', is => 'rw', default => 4 ); } ---- my $cane = Cane->new({ peli => 4 }); say $cane->peli; 4 ---- Autobox ---- Metodi su tipi nativi ---- Ruby ---- say uc "Bambi è tra noi"; "Bambi è tra noi"->uc()->say(); "Bambi è tra noi"->uc->say; ---- "Testo"->metodo(); $stringa->metodo(); ---- say 5->dec; 4 ---- my $list = [4, 7, 23, 8]; my $sum = 0; for my $elem (@$list) { $sum += $elem; } say $sum; ---- say [4, 7, 23, 8]->sum; [4, 7, 23, 8]->sum->say; ---- 42 ---- [4, 7, 23, 8]->foreach(sub { say "Numero: $_[0]"; }); ---- # Chaining say " Separiamo con virgole " ->strip ->split(qr/\s+/) ->join(','); Separiamo,con,virgole ---- *** 3 *** Programmazione Funzionale ---- Haskell ---- * map, grep ---- my @numeri = (3, 4, 24, 7); my @plus_10 = map { $_ + 10 } @numeri; my @pari = grep { !($_ % 2) } @numeri; ---- * closure ---- my $factory = sub { my $enclosed = 5; return sub { return shift() + $enclosed; }; }; my $sum5 = $factory->(); my $nine = $sum_5->(4); ---- * operatori o... funzioni ---- # 4+1 o 4++ my $cinque = inc 4; # $cinque*2 my $dieci = double $cinque; # $cinque*$cinque my $v5 = square $cinque; ---- * folding ---- my $sommal = foldl { shift() + shift() } 0, [1..10]; my $sommar = foldr { shift() + shift() } 0, [1..10]; 55 55 ---- foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs) ---- * liste ---- my $solo_4 = take 4, [qw/3 5 2 8 9 23/]; my $ultimi = drop 4, [qw/3 5 2 8 9 23/]; my $div = span { shift() < 5 } [qw/3 5 2 8 9 23/]; my $div_1 = zip $div; [ 3, 5, 2, 8 ] [ 9, 23 ] [ [3, 2], [5, 8, 9, 23] ] [ 3, 2, 5, 8, 9, 23 ] ---- * liste infinite ---- my $primi_8 = take(8, iterate { shift() * 2 } 1); my $sempre_8 = take(8, repeat(42)); [1, 2, 4, 8, 16, 32, 64, 128] [42, 42, 42, 42, 42, 42, 42, 42] ---- * testo ---- my $parole = words 'il barone rosso'; my $frase = unwords $parole; ['il', 'barone', 'rosso'] 'il barone rosso' ---- unwords :: [String] -> String unwords [] = [] unwords ws = foldr1 (\w s -> w ++ ' ':s) ws ---- * currying (Sub::Curried) ---- my $saluta = curry($saluto, $nome) { say "$saluto, $nome"; }; my $buongiorno = $saluta->('buongiorno'); $saluta->('buonasera', 'Charles'); $buongiorno->('Hakim'); $buongiorno->('Michele'); ---- * composing (Sub::Compose) ---- my $to_celsius = sub { return shift() - 32; }; my $to_kelvin = sub { return shift() + 459.67; }; my $from_fahrenheit = sub { return shift() / 1.8; }; my $f2c = compose( $to_celsius, $from_fahrenheit ); my $f2k = compose( $to_kelvin, $from_fahrenheit ); ---- say $f2c->(212); say $f2k->(212); 100 373.15 ---- Non tutto è parte del linguaggio ---- ma ---- Perl è estensibile ---- perl è estensibile ---- Devel::Declare possiamo programmare il parser ---- quanto mostrato già esiste ---- e funziona ---- bene ---- *** 4 *** CPAN ---- oltre 18000 moduli ---- Unix è l'ambiente di sviluppo Perl è la virtual machine CPAN è il linguaggio ---- Matt Trout ---- un po' matto ---- Catalyst ---- framework MVC ---- Ruby on Rails ---- * solo dispatcher + I/O * modelli: moduli CPAN * DB: DBIx::Class, Rose::DB::Object, ... * viste: moduli CPAN * Templating: TT, Mason, ... * decine di base controller (form, ...) * decine di plugin (autenticazione, I18N, ...) ---- DBIx::Class ---- * Object-Relational Mapper * resultset-oriented * astrazione SQL (join, where, subquery, ...) * caching, prefetching, ... * transazioni esprimibili via closure * facilmente estensibile ---- Il Perl che ricordo non è così ---- Quanta roba devo installare per avere tutto ciò? ---- 90% Task::Kensho ---- il resto è su CPAN ---- Sempre su CPAN * interfacciamento a database * FTP, POP3, SSH, SMTP, IRC, ... * astrazione filesystem, database * web (template, tag clouds, CAPTCHA, ...) * ricerche automatiche su engine * import/export Excel, CSV, PDF, ... * interfacce grafiche (Gtk, ...) * generazione di parser da grammatiche * ritocco immagini, generazione barcode, ... * [tutto l'immaginabile + il demenziale] ---- *** 5 *** Perl 5 è qui Perl 6 arriverà ---- Perl 6: annunciato nel 2000 ---- Perl 5: rallentamento sviluppo ---- Perl 6: arriva quando arriva ---- Perl 5: prendiamo qualcosa da Perl 6 ---- Perl 5: e sviluppiamo anche altro ---- Perl 5 != Perl 6 ---- Rinascita ---- Immigrazione ---- Ritorno di emigrati ---- Perl 6: arriverà a primavera 2010 ---- *** 6 *** Community ---- irc.perl.org ---- PerlMonks.com ---- Community che invoglia a dare il proprio contributo ---- Non sei bravo abbastanza ---- Nessuno lo è ---- Tutti possono contribuire ---- * Testing * Bug reporting * Documentazione * Traduzioni * Programmazione ---- Caffeina Notti di luna piena Capelli lunghi (o barba) ---- Git ---- o Subversion a volte ---- git branch ---- fai tutti gli errori che vuoi... ---- ...senza che nessuno lo sappia ---- mai ---- Community Italiana ---- www.perl.it ---- da 10 anni ---- punto di aggregazione della community italiana ---- documentazione * corsi * articoli * recensioni * blog ---- pod2it traduzione documentazione ufficiale ---- mailing list ---- chat ---- utile !('perdita di tempo') ---- a volte ---- Nordest.pm ---- come minimo... ...due pranzi all'anno ---- PerlHike ---- PerlSki? ---- Associazione Perl.it ---- Italian Perl Workshop ---- YAPC::EU 2010 ---- Pisa Agosto 2010 ---- 4-6 probabilmente ---- Grazie ai nostri soci e sponsor ---- * Eventi sempre migliori * Più ospiti * Più caffé e pasticcini * Anche nel Nordest (?) ---- Grazie ai nostri volontari ---- * Documentazione/articoli * Gestione server e sito * Traduzioni per pod2it * Organizzazione eventi ---- Trovi Perl interessante? ---- O divertente? ---- www.perl.it www.perl.org ---- Grazie!