Perl : un aperçu...

  • Avant de voir en détail...

  • ... un survol de Perl

Sources

Objectifs de cette initiation à Perl

  • Savoir écrire un programme de concordance

  • Savoir écrire un programme de segmentation d'un fichier en mots

  • Dans les 2 cas, il s'agit de lire un fichier pour :
    extraire des contextes autour d'un pôle choisi
    construire le dictionnaire de tous les mots contenus dans le fichier

Ressources

  • On trouvera dans le sous-dossier scripts un ensemble de programmes que l'on étudiera en détail...

  • 0-exemples-string-array-hash.pl : manipulation scalaire, array, hash
    0-exemple-chaine-split.pl : des chaînes aux tableaux (segmentation)
    0-openfile-and-search.pl : lire un fichier (filtrage)
    0-procedure.pl : notion de sous-programme (procédures)
    1-concordance.pl : un programme de concordance à améliorer...
    2-tokenizer.pl : un programme de segmentation à améliorer...

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 :

Concrètement, comment on travaille avec Perl

  • 3 perls installés sur la machine de SF !!!
    => 2 perls pour windows 5.8.9 et 5.12
    => 1 perl pour Cygwin 5.10
  • Pour un débutant : installer la version ActiveState de Perl...
  • comment on lance un script perl
    pour démarrer : perl nomduscript [Argument1 Argument2 etc.]
    (il y a d'autres façons...)
  • => le perl lancé ainsi est le premier référencé dans la PATH du contexte d'utilisation
    * voir "astuces" complémentaires : spécifier un perl particulier, perl windows via cygwin...

Les bases de Perl : ce qu'il faut savoir au minimum...

  • notion de script (perl en uniligne : non vu en cours (cf slides))
  • perl et les interfaces graphiques ? Exemples : Le Trameur / mkAlign
  • les scalaires (ça commence toujours par $)
  • les tableaux / listes (noté @)
  • les tables de hashage ou tableaux associatifs (noté %)
  • structure de contrôle et expression conditionnelle (if, while etc.)
  • entrée/sortie : lire/écrire dans un fichier
  • parcours de fichiers
  • regexp

Historique

  • Perl 1.000 - 1987, Perl 3.000 - 1989, Perl 4.000 - 1991, Perl 4.036 - 1993, Perl 5.000 - 1994, Perl 5.001 - 1995, Perl 5.002 - 1996, Perl 5.003 - 1996, Perl 5.004 - 1997, Perl 5.005 - 1998, Perl 5.6 - 2000, Perl 5.8 - 2002, Perl 5.10 - 2007, Perl 5.12 - 2010...

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 : un premier script nommé script.pl

  • On édite le fichier script.pl (notepad, gedit, emacs...) :
    (pour les pgs perl => extension habituelle avec .pl)

        #!/usr/bin/perl;
        # je suis un commentaire qui ne dit pas grand chose...;
        print "Hello, world\n";
  • Pour lancer ce script :

        perl script.pl (dans la ligne de commandes)
        ./script.pl (sous unix et après avoir fait : chmod +x script.pl)

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, delete :

  •     @keys = keys %hash;     # ( 42, "laz", "jm2l" )
    
        @values = values %hash;
    
        delete $hash{42};
  •     if (exists ($hash{$cle})) { # on vérifie si un clé existe dans le hash...
        ... # ...
        }

Aperçu - parcours de liste / de hash

  • foreach...

  •     foreach my $element (@array) { # pour chacun des éléments de la liste...
        # on fait quelque chose avec l'élément de la liste
        print "$element est l'élement n° ???? de la liste ! \n"; # comment modifier ce code pour récupérer le n° ?
        }
  •     foreach my $element (keys %thearray) { # pour chacun des éléments de la liste des clés...
        ... # que doit-on ajouter pour afficher la clé et sa valeur ?
        }
  • while...

  •     while (($key,$val) = each %thearray) { # la fonction each permet de récupérer les couples clés valeurs
        # on fait quelque chose avec la clé et/ou la valeur de la clé...
        }

Aperçu - lire / écrire (1)

  • open...

  •     open(FILE1,toto.txt); # ouverture en lecture du fichier toto.txt
        open my $fh1, "<" ,"toto.txt" ; # notation perl moderne : open a 3 arguments...
        open(FILE2,">titi.txt); # ouverture en écriture du fichier titi.txt
        open my $fh2, ">", "titi.txt" ;
  • close...

  •     close(FILE);

Aperçu - lire / écrire (1)

  • lecture...

  •     $ligne=<FILE1>;
  • écrire...

  •     print FILE2 $ligne ;

Aperçu - lire un fichier (programme idiot...)

  •     open(FILE1,"$ARGV[0]");
        open(FILE2,">$ARGV[1]");
        while ($ligne=<FILE1>) {
        		print FILE2 $ligne;
        }
        close(FILE1);
        close(FILE2);
        exit;
  •     open(FILE1,"$ARGV[0]");
        @LIGNES=<FILE1>);
        foreach my $lignes (@LIGNES) {
           print $ligne;
        } etc.

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
    Perl a souvent été décrit comme un langage de programmation dans lequel les programmes sont faciles à écrire, mais difficiles à lire. Ce n'est un secret pour personne que c'est la syntaxe des expressions régulières qui est d'abord et avant tout responsable. C'est donc amusant de voir que les autres langages de programmation ont emprunté à Perl les expressions régulières à la vitesse grand V.
    -- traduction JMD

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

  •     $text = <<'TEXT';
        Les ordinateurs à base de processeurs Alpha, fabriqués par la
        société Digital, permettent d'exécuter le système Open VMS.
        TEXT
  •     $text =~ s/Digital/Compaq/g;
  •     $text =~ s/Compaq/HP/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/

  • 6.0 Go, plus de 17 000 modules, plus de 4 000 auteurs

  • 243 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

  • des conférences chaque mois

    • 27 en 2008, 25 en 2009, déjà 10 prévues en 2010

  • 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

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

  • bases de données

    • DBI

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

    • DBI::Proxy, DBD::Gofer

    • SQL::Abstract

CPAN - Sélection

  • ORM

    • Class::DBI, DBIx::Class

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

  • frameworks web modernes

    • Jifty

    • Catalyst

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

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)

  • BackupPC (sauvegarde)

Utilisateurs

  • sites web :

    • 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

Le futur

  • 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

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

  • gel des nouvelles fonctionnalités depuis le 21 novembre

  • publication fin décembre 2009 ou début janvier 2010

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 15 ans

  • Perl 6 conçu pour durer autant

  • pas d'urgence, Perl 5 stable

Perl 6

Conclusion

  • langage mature

  • Perl 5.8 en production massive, stable

  • Perl 5.10 en cours de déploiement

  • Perl 5.12 d'ici un an

  • Rakudo* au printemps 2010

  • Perl 6 d'ici quelques années

Questions ?

Merci