wiki:PerlInitiation

Version 22 (modified by Vincent Caron, 14 years ago) (diff)

--

Perl - Initiation

Ce support de cours s'adresse à des débutants en Perl, et présente l'essentiel du language pour une durée prévue de formation de 2 jours.

1. Contexte

Historique

  • Créé en 1987 par Larry Wall, comme outil de traitement de donnée
  • Mantra 1: "Il y a plus d'une façon de le faire."
  • Mantra 2: "Rendre les choses faciles faciles, et les choses difficiles possibles."
  • PERL: Practical Extraction and Report Language
  • perldoc perlhist

Les cousins

Langage Licence Historique Actualité Popularité Environnement
Perl GPL ou Artistic 1987 5.8.x ++ CPAN, 10.000 modules
Python Python (compatible GPL) 1990 2.4.x +++ Pypi, 1300 packages
Ruby GPL ou Ruby 1995 1.8.x + Rubyforge, 1500 projets
PHP PHP4 (incompatible GPL) 1995 4.4.x/5.1.x ++++ PEAR, 370 packages

2. Installation

Unix

  • Perl est déjà installé ! perl --version
  • Se référer au système de packetage de votre système d'exploitation

Windows

  • Le plus populaire: ActiveState Perl
  • Egalement disponible: Perl pour Cygwin
  • Difficile de se passer de la ligne de commande et d'un bon éditeur

3. Description rapide

  • L'interpréteur (un simple binaire)
  • Invocation d'un script Perl (shebang: #!, ligne de commande)
  • Les modules: Perl et natifs
  • Documentation
    • Générale: perldoc, man
    • Modules: cpan.org
    • Livres: suivez le chameau ! (Camel books chez O'Reilly)

4. Premier programme

  • Hello world:
    #!/usr/bin/perl
    
    print "Hello world !\n";
    
  • Expressions, blocs, commentaires
  • Quoting: guillemets, apostrophes
  • Heredocs:
    print <<<EOF;
    Hello world !
    Fin du programme.
    EOF
    

5. Les variables (scalaires, listes, hashes)

  • Utilisation d'une variable scalaire:
    $hello = "Hello world !\n";
    print $hello;
    
  • Utilisation d'une liste:
    @hello = ("Hello", "world", "!\n");
    print "$hello[0] $hello[1] $hello[2]";
    print $hello[0]." ".$hello[1]." ".$hello[2];
    print join(" ", @hello);
    
  • Utilisation d'un tableau associatif (hash):
    %hello = (debut => "Hello", milieu => "world", fin => "!\n");
    print "$hello{debut} $hello{milieu} $hello{fin}";
    

Manipulation des scalaires

  • Opérateurs artithmétiques (entiers, flottants et chaînes)
    $a = 42; $b = ($a * 5) + 8;
    
  • Concaténation (chaînes)
    $a = "Hello"; $a = $a . " world"; $a .= " !\n";
    
  • Opérateur de comparaison et booléens
    $nombre = 42;
    $mot = "bonjour";
    if ($nombre == 42) { print "Egalité\n"; }
    print "Egalité\n" if $nombre == 42;
    if ($mot eq 'bonjour') { print "Equivalence\n"; }
    

Manipulation des listes

  • Méthode alternative pour construire une liste:
    @liste = qw/Hello world !\n/;
    @liste = split(/ /, "Hello world !\n");
    
  • Extraire une partie de la liste (voir splice également):
    @extrait = @liste[1..2]; # world, !\n
    
  • Extraire les éléments d'une liste (vers des scalaires):
    ($debut, undef, $fin) = @hello;
    
  • Concaténer les éléments d'une liste (dans un scalaire):
    $phrase = join(' ', @mots);
    
  • Parcourir les éléments d'une liste:
    foreach $mot (@hello) { print "$mot"; }
    foreach (@hello) { print $_; }
    foreach (@hello) { print; }
    print foreach @hello;
    
  • Ajouter un élément à une liste:
    push @liste, 'bonjou';
    
  • Retirer le premier élément de la liste:
    $element = shift @liste;
    
  • Trier une liste:
    @triee = sort @liste;
    @triee = sort { ! $a <=> $b } @liste;
    
  • Filtrer une liste:
    @selection = grep { $_ > 10 } @liste;
    
  • Transformer les éléments d'une liste (vers une autre liste):
    @resultat = map { $_ * 2 } @liste;
    

Manipulation des hashes

  • Obtenir la liste des clés (indices):
    print $hello{$_} foreach keys %hello;
    
  • Vérifier la présence d'une clé:
    print "Présent" if defined $hello{debut};
    

6. Boucles et tests (contrôle du programme)

  • Boucle numérique classique (à la "C"):
    for ($i = 0; $i < 10; $i++) { print "$i\n"; }
    
  • Boucle do/while/until:
    $i = 0;
    while ($i < 10) { print "$i\n"; $i++; }
    do { print "$i\n"; $i++; } until ($i == 10);
    
  • Tests:
    if ($a == 5) { print "\$a vaut 5\n"; }
    elsif ($a == 6) { print "\$a vaut 6\n"; }
    else { print "\$a vaut $a\n"; }
    
  • Contrôle des boucles (voir aussi: continue, redo):
    foreach (@lines) { next if $_ eq ''; print; }
    foreach (@lines) { last if $_ eq ''; print; }
    

7. Gestion des fichiers

  • Numéroter les lignes d'un fichier:
    $line = 0;
    $line++, print "$line $_" while (<STDIN>);
    
  • Ouvrir un fichier explicitement (en lecture):
    open(SOURCE, "<source.txt");
    while (<SOURCE>) { ... }
    close(SOURCE);
    
  • Ouvrir un fichier explicitement (en écriture):
    open(SORTIE, ">sortie.txt");
    print SORTIE "Contenu du fichier ...";
    close(SORTIE);
    
  • Influence de la variable $/ sur <FILE>
  • PerlIO avancé (important sous Windows): binmode, CRLF

8. Fonctions (sous-programmes)

sub ma_fonction {

my ($param1, $param2) = @_;

}

sub ma_fonction {

my $param1 = shift @_; my $param2 = shift @_; (@_ == 0) or die "Trop d'arguments !";

return 1;

}

# J'appelle ma fonction $resultat = ma_fonction("valeur 1", "valeur2"); }}}

9. Expressions régulières

  • Recherche d'un mot dans la chaîne:
    $a = "Hello world";
    print "Trouvé" if $a =~ m/hello/;
    
  • Recherche d'un mot dans la chaîne (insensible à la casse):
    print "Trouvé" if $a =~ m/hello/i;
    
  • Egalité simple sur toute la chaîne:
    print "Egal" if $a =~ m/^Hello world!$/;
    
  • Extraction d'un nombre:
    print "Premier nombre lu: $1" if /([0-9]+)/;
    print "Premier nombre lu: $1" if /(\d+)/;
    
  • Remplacer un mot par un autre (plusieurs fois si nécessaire):
    $a =~ s/un mot/par un autre/g;
    
  • Règles générales
  • Expressions régulières 'Perl' et 'POSIX' (sed, awk, etc.)

10. Quelques programmes

  • Le corps d'un programme respectant les canons d'une comande Unix:
    #!/usr/bin/perl -w
    
    # Perl_template, a boilerplate for cool Perl programs.
    # Copyright (C) 2005,2006 Bearstech - http://www.bearstech.com
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    
    use Getopt::Long;
    use strict;
    
    my $program = "perl_template";
    my $version = "3.1416-beta";
    
    my $opt_help    = 0;
    my $opt_version = 0;
    
    GetOptions(
      'help|h'        => \$opt_help,
      'version|v'     => \$opt_version,
    ) || print_short_help();
    
    print_help() if $opt_help;
    print_version() if $opt_version;
    
    print "You should program something useful here.\n";
    exit(0);
    
    sub print_help {
      print <<EOF;
    This is a template program which does actually nothing.
    
    Usage: $program [options]
    
    Options:
      -h, --help            Display this help and exit
      -v, --version         Display version information and exit
    EOF
      exit 0;
    }
    
    sub print_short_help {
      print STDERR "Try '$program --help' for more information.\n";
      exit 1;
    }
    
    sub print_version {
      print "$program $version - Copyright 2005,2006 Bearstech\n";
      exit 0;
    }
    
    • perl -w
    • use strict
    • Meta-information: nom du programme(!), version, auteur, date, licence
    • Utilisation du module Getopt::Long
    • Documentation
  • Traiter un fichier CSV (exercice!)
    • lecture simple dans des structures Perl
    • sortie: tableau HTML
    • sortie: tri par une colonne spécifiée en option du programme