Eric Laporte Institut Gaspard-Monge Université de Marne-la-Vallée France Introduction à Perl
Schwartz, R., Christiansen, T., 1998 (2e édition), Introduction à Perl, O'Reilly, 303 p. Wall, L., Christiansen, T., Orwant, J., 2001 (3e édition), Programmation en Perl, O'Reilly, 1045 p. Ray, E., McIntosh, J., 2003, Perl & XML, O'Reilly, 211 p. Bibliographie
Développement collaboratif, logiciel libre Principal auteur : Larry WallVersion : 5 Comprehensive Perl Archive Network ( ) : sources, binaires, modules, documentation Philosophie : faire ce que l'utilisateur cherche à faire Compilation et interprétation - un interpréteur Perl compile le programme puis l'exécute sans sauvegarder la forme compilée (utilisation la plus courante) - un compilateur Perl compile le programme (plusieurs langages cibles sont possibles) et le sauvegarde sans l'exécuter Notions de base (1/2)
# villePays.pl open(INFILE, "villePays.lst") or die "Impossible d'ouvrir villePays.lst en lecture : $!"; my %table; while ( ) { chomp; my ($ville, $pays) = split /, /; $ville; } foreach $pays (sort keys %table) { print "$pays: "; print join ', ', print ".\n"; }
Pas de programme principal, mais il peut y avoir des fonctions # marque un commentaire d'une ligne Les parenthèses autour des fonctions prédéfinies sont facultatives $! $_ etc. variables : tableau %table : table de hachage $ville : scalaire (= types simples) Notions de base (2/2)
#motDePasse.pl my $secretword = "lama" ; print "Votre nom ? " ; my $name = ; chomp ($name) ; print "Hello, $name !\n" ; print "Quel est le mot de passe ? " ; my $guess = ; chomp $guess ; while ($guess ne $secretword) { print "Faux, essayez encore. Quel est le mot de passe ? "; $guess = ; chomp ($ guess) ; } Entrées-sorties, scalaires (1/2)
my : opérateur qui déclare une variable locale (si on ne déclare pas la variable, elle est globale) : opérateur qui lit une ligne dans un descripteur de fichier chomp() : fonction qui supprime la fin de ligne finale (modifie la variable à laquelle elle s'applique) ne : opérateur de comparaison de chaînes (ordre alphabétique) Entrées-sorties, scalaires (2/2)
#tableau.pl = ("alpaca", "dromadaire", "lama") ; #liste print "Quel est le mot de passe ? " ; my $guess = ; chomp $guess ; my $i = 0 ; my $correct = "maybe" ; while ($correct eq "maybe") { if ($words[$i] eq $guess) { $correct = "yes" ; } elsif ($i ; chomp ($ guess) ; $i = 0 ; } } Tableaux (1/2)
Un tableau est un nom de liste, il commence et il est initialisé par une liste Pas de distinction entre nombres et chaînes à la déclaration Accès à un tableau : avec $ et [] Eléments numérotés à partir de 0 < : opérateur de comparaison de nombres if () {} elsif () {}... else {} accolades obligatoires même pour une seule instruction Tableaux (2/2)
#hachage.pl my %words = ( "dominique" => "alpaca", "fabien" => "dromadaire", "lionel" => "lama", "nicolas" => "alpaca") ; print "Votre nom ? " ; my $name = ; chomp ($name) ; print "Salut, $name !\n" ; my $secretword = $words{$name} ; print "Quel est le mot de passe ? " ; my $guess = ; chomp $guess ; while ($guess ne $secretword) { print "Faux, essayez encore. Quel est le mot de passe ? "; $guess = ; chomp ($ guess) ; } Tables de hachage (1/2)
Le nom d'une table de hachage commence par % et elle est initialisée par une liste (on peut remplacer les => par des virgules) Accès aux valeurs : avec $ et {} Si la clé n'est pas trouvée, la valeur est undef. Tables de hachage (2/2)
#controle.pl my $stops = 0 ; if ($stops) { print "Arret $stops. \n" ; } else { print "Depart. \n" ; } while ($stops ) ; } unless ($stops) { print "Depart. \n" ; } else { print "Arret $stops. \n" ; } until ($stops eq 0) { $stops -- ; print "Prochain arret ? " ; chomp($location = ) ; } print "Terminus.\n" if ($stops eq 0) ; Structures conditionnelles (1/4)
unless(condition) : équivalent à if(not(condition)) until(condition) : équivalent à while(not(condition)) expression if(condition) ; L'expression ne peut pas être une instruction complexe. Possible aussi avec unless, while, until. expression until(condition) ; La condition est évaluée avant l'expression. do {instructions} until (condition) ; Les instructions sont exécutées avant la condition. Structures conditionnelles (2/4)
#controle2.pl my $stops = 0 ; do { $stops ++ ; print "Prochain arret ? " ; chomp($location = ) ; } while ($stops ) ; } until ($stops eq 0) ; print "Terminus.\n" ; for ($stops = 0 ; $stops ) ; } print "Terminus. \n" if ($stops == 5) ; Structures conditionnelles (3/4)
#controle3.pl my $i = 0 ; foreach $i (1,2,3,4,5) { # $i est local а foreach print "Prochain arret ? " ; chomp($location = ) ; } print "$i. \n" ; # vaut toujours 0. = ("alpaca", "chameau", "dromadaire", "lama") ; foreach $i { print "$i" ; } print "\n" ; foreach { # Variable par defaut print "$_" ; } print "\n" ; foreach { print ; } print "\n" ; Structures conditionnelles (4/4)
#lireFichier.pl my $secretword = "lama" ; print "Quel est le mot de passe ? " ; my $guess ; while ($guess= ) { chomp $guess ; if($guess ne $secretword) { print "Faux, essayez encore. Quel est le mot de passe ? "; } else { die "Exact.\n" ; } } print "Quel est le mot de passe ? " ; while ( ) {# Variable par défaut $_ chomp $_ ;# On peut supprimer $_ if($_ ne $secretword) {#Ici on ne peut pas le supprimer print "Faux, essayez encore. Quel est le mot de passe ? "; } else { die "Exact.\n" ; } } Lecture d'un fichier
#joinSplit.pl = (1, 3, 5, 7) ; my $string = ; print $string, "\n" ; my $line = "merlyn::118:10:Randal:/home/merlyn:/usr/bin/perl:" ; = split(/:/,$line) ; print "$fields[0], $fields[1], $fields[2]...\n" = split(/:+/,$line) ; print "$fields[0], $fields[1], $fields[2]...\n" ; join, split
#piles.pl = (1, 3, 5, 7) ; print "\n" ; 9, 11, 13) ; #empiler print "\n" ; my $last = ; #depiler print "\n" ; -5, -3, -1) ; #empiler a gauche print "\n" ; my $first = ; #depiler a gauche print "\n" ; Piles
$aref = # $aref est maintenant une référence $href = \%hash; # $href est maintenant une référence à %hash $aref = [ 1, "foo", undef, 13 ]; # $aref est maintenant une référence à une liste $href = { APR => 4, AUG => 8 }; # $href est maintenant une référence à une table de hachage Créer des références
{$aref} peut être utilisé comme un tableau {$href} peut être utilisé comme une table Un tableau Retourner le tableau $a[3] ${$aref}[3] Un élément du tableau $a[3] = 17; ${$aref}[3] = 17 Affecter un élément %h %{$href}Une table de hachage keys %hkeys %{$href} Liste des clés de la table $h{'red'} ${$href}{'red'} Un élément de la table $h{'red'} = 17 ${$href}{'red'} = 17 Affecter un élément Utiliser des références (1/2)
${$aref}[3] est abrégé en $aref->[3] ${$href}{'red'} est abrégé en $href->{'red'} Utiliser des références (2/2)