Perl, langage d'aujourd'hui et de demain

Sébastien Aperghis-Tramoni, sebastien@aperghis.net

Mini-bio

  • ingénieur système et développeur

  • utilisateur de Perl depuis 15 ans

  • contributeur Perl et CPAN (~40 modules)

  • participant à de nombreuses conférences en France et en Europe

  • auteur de plusieurs articles parus dans Linux Magazine France

Perl

  • Practical Extraction and Report Language

  • langage interprété et dynamique

  • libre : GNU GPL et Artistic License

  • créé en 1987 par Larry Wall

Larry Wall

  • Caractéristiques :

    • lunettes carrées

    • moustache

    • chemise hawaïenne

Larry Wall

  • ≠ Weird Al Yankovic :

Historique

  • Perl 1.000 - 1987

  • Perl 3.000 - 1989

  • Perl 4.000 - 1991

  • Perl 4.036 - 1993

Historique

  • Perl 5.000 - 1994

  • Perl 5.001 - 1995

  • Perl 5.002 - 1996

  • Perl 5.003 - 1996

  • Perl 5.004 - 1997

  • Perl 5.005 - 1998

Historique

  • Perl 5.6 - 2000

  • Perl 5.8 - 2002

  • ...

  • Perl 5.10 - 2007

  • Perl 5.12 - 2010

  • Perl 5.14 - 2011

Caractéristiques

  • à l'origine, langage de glue

  • intermédiaire entre le shell, awk, sed d'un côté et C de l'autre

  • ajouts de langages fonctionnels comme Lisp

  • maintenant, langage dynamique généraliste

  • extrêmement portable

  • très stable

Slogan

  • TIMTOWTDI

    • There is more than one way to do it

  • les trois vertus du programmeur :

    • paresse

    • impatience

    • orgueil

Points forts

  • multi-paradigmes : impératif, fonctionnel, orienté objet

  • types de base : scalaire (chaîne, nombre), tableau, hash

  • gestion de mémoire par ramasse-miettes

  • expressions régulières

  • OO : multi-héritage, surcharge d'opérateur, fermetures

  • Unicode

Points faibles

  • faiblement typé

  • très (trop) permissif

  • paradigme objet très (trop) simple

  • ramasse-miettes par comptage de références

  • syntaxe devenue lourde pour certaines opérations

Aperçu

  •     print "Hello, world\n";

Aperçu - Variables

  •     $var = "du texte au hasard";
        print "var=$var\n";     # "var=du texte au hasard"
    
        $var = 42;
        print "var=$var\n";     # "var=42"

Aperçu - Tableaux

  •     @array = ( 1, 2, 3, 4, 5 );
        @array = ( "abc", "def", "ghi" );
  • TIMTOWTDI :

  •     @array = ( 1 .. 5 );
        @array = ( "a" .. "z" );
        @array = qw( abc def ghi );

Aperçu - Tableaux

  • valeurs et tranches :

  •     $var = $array[2];           # 3
        @values = @array[1, 3];     # (2, 4)

Aperçu - Tableaux

  • opérateurs push, pop, shift, unshift, delete :

  •     @array = ( 1 .. 5 );
  •     push @array, 6, 7;          # (1, 2, 3, 4, 5, 6, 7)
        $var = pop @array;          # (1, 2, 3, 4, 5, 6)
  •     $var = shift @array;        # (2, 3, 4, 5, 6)
        unshift @array, 0;          # (0, 2, 3, 4, 5, 6)
  •     $var = delete $array[3];    # (0, 2, 3, 5, 6)

Aperçu - Tableaux

  • opérateur sort :

  •     @array = ( 4, 8, 5, 3, 0, 2 );
    
        @array = sort @array;       # (0, 2, 3, 4, 5, 8)
    
        @array = sort { $b <=> $a } @array;
  • opérateur reverse :

  •     @array = ( 1 .. 5 );
    
        @array = reverse @array;    # (5, 4, 3, 2, 1)

Aperçu - Hashes (tableaux associatifs)

  •     %hash = (
            laz     => "Linux Azur",
            jm2l    => "Journée Méditerranéenne des Logiciels Libres",
            42      => "la réponse",
        );
  • valeurs et tranches :

  •     $var = $hash{jm2l};
        $var = $hash{"jm2l"};
    
        $var = $hash{42};
    
        @values = @hash{42, "laz"}; # ("la réponse", "Linux Azur")

Aperçu - Hashes (tableaux associatifs)

  • opérateurs keys, values, delete :

  •     @keys = keys %hash;     # ( 42, "laz", "jm2l" )
    
        @values = values %hash;
    
        delete $hash{42};

Aperçu - Structures

  •     %machine = (
            profane => {
                hostname  => "profane.mongueurs.net",
                addresses => [
                    { type => "ipv4", addr => "81.80.147.194" },
                ],
                status    => "up",
                services  => [ "http", "svn", "smtp" ],
            },
            sferics => {
                hostname  => "sferics.mongueurs.net",
                addresses => [
                    { type => "ipv4", addr => "81.80.147.197" },
                ],
                status    => "down",
                services  => [ "http", "cvs", "smtp" ],
            },
        );
  •     print $machine{profane}{addresses}[0]{addr};    # "81.80.147.194"

Aperçu - Expressions régulières

  • Perl has often been tagged as a language in which it's easy to write programs that are difficult to read, and it's no secret that regular expression syntax that has been the chief culprit. Funny that other languages have been borrowing Perl's regular expressions as fast as they can...

    -- Larry Wall, Apocalypse 5

Aperçu - Expressions régulières

  • m// - recherche de correspondances

  •     $text = "whack zlott ooooff kraaack zzzzzwap";
    
        $text =~ /(kra+ck)/;
    
        print $1;               # "kraaack"
  •     $line = "peer_list = host1 host2 host3";
    
        $line =~ m/^(\w+) *= *(.*)$/;
    
        print $1;               # "peer_list"
        print $2;               # "host1 host2 host3"

Aperçu - Expressions régulières

  • s/// - recherche et remplacement

  •     $source =~ s/OpenOffice.org/LibreOffice/g;
  •     $World =~ s/war/peace/g;

Aperçu - Expressions régulières

  • s/// - recherche et remplacement

  •     $text = "The quick quick brown fox jump jump over the lazy dog.";
  •     $text =~ s/(\w+) +\1/$1/;

Aperçu - Expressions régulières

  • split, join :

  •     $line = "saper:500:500:Sébastien Aperghis-Tramoni:/home/saper:/bin/bash";
        @fields = split /:/, $line;
        print $fields[5];       # "/bin/bash"
  •     $fields[3] = "Groucho Marx";
        $line = join ":", @fields;
        print $line;    # "saper:500:500:Groucho Marx:/home/saper:/bin/bash"
  •     @flags = qw( UP BROADCAST SMART RUNNING SIMPLEX MULTICAST );
        print join ", ", @flags;
                    # "UP, BROADCAST, SMART, RUNNING, SIMPLEX, MULTICAST"

Aperçu - Contrôle de flux

  •     while (defined ($line = <$in>)) {
            next if $line =~ /^\s*$/ or $line =~ /^#/;
            last if $line =~ /^__END__$/
    
            chomp $line;
    
            if ($line =~ /\\$/) {
                $line .= <$in>;
                redo;
            }
            
            # process $line
            # ...
        }
  •     continue {
            # do a bit more with $line
        }

Aperçu - Fonctions

  •     sub fib {
            my ($n) = @_;
            return 1 if $n == 1 or $n == 2;
            return fib($n-1) + fib($n-2);
        }
  •     print fib(7);       # 13

Aperçu - Fermetures

  •     {
            my $seq = 42;
            sub next_seq { return ++$seq }
        }
    
        print next_seq() for 1..3;      # "43 44 45"

Aperçu - Fermetures

  •     sub curry_mult {
            my $num = shift;
            return sub { return $_[0] * $num }
        }
    
        *times_two   = curry_mult(2);
        *times_three = curry_mult(3);
    
        print times_two(5);     # 10
        print times_two(7);     # 14
        print times_three(5);   # 15
        print times_three(7);   # 21

Aperçu - Objets

  •     package Tree;
    
        sub new {
            my ($class, %args) = @_;
            my $self = bless {}, $class;
            # init $self using %args
            return $self
        }
    
        sub add_node {
            # ..
        }
  •     use Tree;
    
        my $tree = Tree->new;
    
        $tree->add_node(...);
        $tree->add_node(...);
    
        print $tree->render(as => "text");

CPAN

  • Comprehensive Perl Archive Network

  • collection centralisée et distribuée de modules

  • http://www.cpan.org/

  • 8.0 Go, plus de 20 000 modules, plus de 4 000 auteurs

  • 228 miroirs

CPAN

  • « CPAN is the language, Perl is just its syntax » - Audrey Tang

  • véritable richesse de Perl

  • ciment de la communauté

CPAN

  • des dizaines de nouveaux modules chaque jour

  • de nouvelles idées chaque semaine

  • de nouveaux paradigmes chaque année

CPAN - Sélection

  • shell, gestion de programmes

    • Getopt::Long, Pod::Usage

    • Proc::Daemon

    • Proc::Background, IPC::Run

CPAN - Sélection

  • expressions régulières

    • Regexp::Common, Regexp::Assemble

    • Text::Match::FastAlternatives

  • analyse

    • Parse::Yapp, Parse::RecDescent

    • Regexp::Grammars

CPAN - Sélection

  • date et heure

    • Time::HiRes

    • Date::Parse

    • DateTime

    • DateTime::Set, DateTime::Span

    • DateTime::Calendar:: Chinese, Christian, Coptic, FrenchRevolutionary, Hebrew, Japanese, Mayan, Pataphysical

CPAN - Sélection

  • nombres

    • bignum, bigint, bigrat

    • PDL (Perl Data Language == MatLab en Perl)

CPAN - Sélection

  • fichiers - archivage

    • Archive::Tar, Archive::Zip, Compress:Zlib, Compress:Bzip2

  • fichier - chemins

    • File::Spec, Path::Class

    • File::Find::Rule, File::Wildcard

  • fichiers - contenu

    • File::Slurp, File::Tail, File::Temp

CPAN - Sélection

  • objets

    • Class::Accessor

    • Class::Std, Class::InsideOut, Object::InsideOut

    • Møøse, Coat, Mouse

CPAN - Sélection

  • programmation événementielle/asynchrone

    • POE (Perl Object Environment)

    • AnyEvent, EV (libev)

CPAN - Sélection

  • XML

    • XML::LibXML, XML::LibXSLT, XML::Twig, XML::SAX, XML::Tiny

  • sérialisation

    • Storable, Data::Dumper, Data::Dump::Streamer

    • YAML, YAML::XS

    • JSON, JSON::XS

CPAN - Sélection

  • protocoles réseau

    • HTTP, FTP, SSH, SCP, LDAP, NNTP, RADIUS, TacacsPlus, SIP, STOMP, AMQP...

    • DNS, Ping, DHCP

  • réseau bas niveau

    • Net::Pcap, Net::Frame, Net::Packet

CPAN - Sélection

  • courriel

    • MIME::Lite, MIME::Parser

    • Net::SMTP, Net::POP3

    • Email::Simple, Email::MIME, Email::Folder et tous les modules du Perl Email Project

    • Mail::IMAPClient, Mail::Box

CPAN - Sélection

  • web, côté client

    • LWP::UserAgent, LWP::Simple

    • WWW::Mechanize

    • WWW::Scripter

  • analyse HTML

    • HTML::Parser, HTML::TreeBuilder, HTML::DOM

CPAN - Sélection

  • web, côté serveur

    • CGI, CGI::Simple, CGI::Application

    • mod_perl

    • HTTP::Engine

  • génération de HTML, templating

    • HTML::Template, Petal

    • Mason, Template Toolkit

CPAN - Sélection

  • frameworks web modernes

    • Jifty

    • Dancer

    • Catalyst

CPAN - Sélection

  • bases de données

    • DBI

    • MySQL, PostgreSQL, SQLite, Oracle, JDBC, ODBC, Sybase, ADO DB, Unify et encore plus...

    • DBI::Proxy, DBD::Gofer

CPAN - Sélection

  • abstraction SQL

    • SQL::Abstract

    • Data::Phrasebook::SQL

  • ORM

    • Class::DBI, DBIx::Class

    • Rose::DB::Object, DBIx::DataModel

CPAN - Sélection

  • documents bureautique

    • Spreadsheet::WriteExcel, Spreadsheet::ParseExcel

    • OpenOffice::OODoc, Spreadsheet::ReadSXC

    • PDF::API2

  • images

    • GD, Image::Magick, Gimp, Imager

CPAN - Sélection

  • langages externes

    • Inline : C, Java, Python, Ruby, Tcl, Befunge, Lua

  • bibliothèques externes

    • XS, SWIG, P5NCI

CPAN - Sélection

  • interfaces graphiques

    • Tk, Gtk, WxWidgets, Qt, Prima

    • GUI natives : Win32, Aqua (Mac OS X), X11

  • pilotage natif des systèmes

    • Mac::Carbon, Mac::Glue

    • Win32, Win32::OLE, W2RK::WMI

Et concrètement ?

Applications connues

  • Rational ClearCase (gestion de configuration) et ClearQuest

  • SysTran (logiciel de traduction linguistique)

  • Request Tracker, OTRS, Bugzilla (gestionnaires de bugs)

  • SlimServer (logiciel pilotant les systèmes musicaux sans fil de Slim Devices / Logitech)

Applications connues

  • Movable Type (plateforme de publication pour entreprises)

  • Blosxom (blog et gestion de contenu)

  • Koha (gestion de bibliothèque)

  • TWiki, Foswiki, Kwiki, MojoMojo (wikis)

  • GC Star (gestionnaire de collections)

  • Swish-e, Plucene (moteurs d'indexation)

Applications connues

  • Sympa (gestionnaire de listes de diffusion)

  • SpamAssassin (filtre courriel)

  • Open Webmail

  • Webmin (administration de systèmes par interface web)

  • DrakX, Urpmi (installation et gestion des paquets sous Mandriva)

Applications connues

  • BackupPC (sauvegarde)

  • FusionInventory, OCS Inventory

Utilisateurs

  • sociétés :

    • Amazon, eBay, Price Minister, ShopZilla, Ticket Master, Booking, IMDb, Yahoo!, Slashdot, Live Journal, Friendster, Flickr, Google

  • banques :

    • Citigroup, Morgan Stanley, Deutshe Bank, Bank of America, UBS (Union de Banques Suisses), BNP Paribas

Utilisateurs

  • médias :

    • AFP (Agence France Presse), BBC

  • organismes gouvernementaux :

    • NASA, ESA, Météo France, Institut Météorologique Norvégien

  • opérateurs réseaux et associés :

    • France Télécom - Orange, Free Télécom, Cisco, Vodafone, Sifira, OVH, Gandi, VeriSign

Aujourd'hui et demain

  • Perl 5.10, 5.12, 5.14...

  • Perl 6

Perl 5.10

  • très (trop) longtemps en développement

  • à cause de la stabilité de Perl 5.8

  • 5.10.0 publié en décembre 2007

  • maintenant disponible dans les distributions Linux

  • installation facile sous Windows (StrawberryPerl)

Perl 5.10

  • plusieurs parties internes restructurées

  • ajout de protections préventives

  • consommation mémoire moindre

  • certaines fonctionnalités de Perl 6

Perl 5.10 - Syntaxe

  • smart match

    • opérateur ~~

    • permet de comparer magiquement tout type de données

    • cf. perlsyn

Perl 5.10 - Syntaxe

  • given .. when

    • basé sur le smart match

  •     given ($var) {
            when (undef)  { say '$var non défini' }
            when (@array) { say '$var est dans @array' }
            when (%hash)  { say '$var est une clé de %hash' }
            when (\&code) { say 'code($var) est vrai' }
            when (qr/../) { say '$var correspond à la regexp' }
            default       { ... }
        }

Perl 5.10 - Expressions régulières

  • Perl à la traîne derrière PCRE

  • intégration de leurs fonctionnalités

  • ajout de nouveautés, contribuées à PCRE

  • nombreuses correction de bugs

  • nombreuses optimisations (dérécursion, trie, Aho-Corasick)

  • moteur interchangeable

Perl 5.12

  • cycle de développement plus court que pour 5.10

  • une release majeure par an

  • une ou deux release mineure ensuite

  • 5.12.0 publiée le 12 avril 2010

  • 5.12.1 publiée le 16 mai 2010

Perl 5.12

  • compatibilité Y2038

  • mots-clés extensibles

  • support DTrace

  • opérateur yada yada : ...

  • each @array, delete local $hash{key}

  • meilleure gestion des versions de modules

Perl 6

  • un nouveau langage

  • corrige les bizarreries et lourdeurs de Perl 5

  • nouvelles inspirations : Ruby, OCaml, Haskell

  • spécification descriptive (documentation) et validante (suite de tests)

  • des prototypes : Pugs, NQP

Rakudo

  • compilateur Perl 6 écrit en Perl 6 (et PIR)

  • exécuté sur une machine virtuelle, Parrot

  • exécution de plus de 70% des tests de spécification

Parrot

  • machine virtuelle générique

  • portabilité de Perl

  • optimisée pour écrire des compilateurs pour langages dynamiques

  • langage d'assemblage cohérent, sans bizarreries dues à l'architecture

    • voir les articles publiés dans Linux Magazine France n°97, 98 et 99, 122, 123, 124

Perl 6

  • fondamentaux de Perl

    • stabilité

    • longévité

  • Perl 5 utilisé depuis 16 ans

  • Perl 6 conçu pour durer autant

  • pas d'urgence, Perl 5 stable

Communauté

  • très active sur le CPAN, les listes, IRC

  • des conférences chaque mois

    • 27 en 2008, 25 en 2009, 21 en 2010, déjà 8 prévues en 2011

  • en France

Lecture

  • Les dossiers de Linux Magazine : Perl

    • introduction au langage Perl

    • présentation de la communauté

Lecture

  • Perl moderne

    • expressions régulières actuelles

    • objet moderne avec Moose

    • pilotage de bases de données avec DBI

    • programmation événementielle avec POE

    • navigation sur le web avec LWP et WWW::Mechanize

Conclusion

  • langage mature

  • Perl 5.8 en production massive, stable

  • Perl 5.10 en production

  • Perl 5.12 en cours d'intégration

  • Perl 5.14 en 2011

  • Perl 6 d'ici peu de temps

Questions ?

Merci