Eric Laporte Institut Gaspard-Monge Université de Marne-la-Vallée France laporte/ Introduction à...
-
Upload
chretien-frey -
Category
Documents
-
view
109 -
download
2
Transcript of Eric Laporte Institut Gaspard-Monge Université de Marne-la-Vallée France laporte/ Introduction à...
Eric LaporteInstitut Gaspard-Monge
Université de Marne-la-ValléeFrance
http://www-igm.univ-mlv.fr/~laporte/
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 librePrincipal auteur : Larry Wall Version : 5Comprehensive Perl Archive Network (http://www.cpan.org) :sources, binaires, modules, documentationPhilosophie : 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.plopen(INFILE, "villePays.lst") or die "Impossible d'ouvrir villePays.lst en lecture : $!";my %table;while (<INFILE>) { chomp; my ($ville, $pays) = split /, /; push @{$table{$pays}}, $ville; }foreach $pays (sort keys %table) { print "$pays: "; my @villes = @{$table{$pays}}; print join ', ', sort @villes; 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 prédéfinies
@villes : tableau%table : table de hachage$ville : scalaire (= types simples)
Notions de base (2/2)
#motDePasse.plmy $secretword = "lama" ;print "Votre nom ? " ;my $name = <STDIN> ;chomp ($name) ;print "Hello, $name !\n" ;print "Quel est le mot de passe ? " ;my $guess = <STDIN> ;chomp $guess ;while ($guess ne $secretword) { print "Faux, essayez encore. Quel est le mot de passe ? "; $guess = <STDIN> ; 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.plmy @words = ("alpaca", "dromadaire", "lama") ; #listeprint "Quel est le mot de passe ? " ;my $guess = <STDIN> ;chomp $guess ;my $i = 0 ;my $correct = "maybe" ;while ($correct eq "maybe") { if ($words[$i] eq $guess) { $correct = "yes" ; } elsif ($i < 2) { $i ++ ; } else { print "Faux, essayez encore. Quel est le mot de passe ? "; $guess = <STDIN> ; chomp ($ guess) ; $i = 0 ; } }
Tableaux (1/2)
Un tableau est un nom de liste, il commence par @ 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.plmy %words = ( "dominique" => "alpaca", "fabien" => "dromadaire", "lionel" => "lama", "nicolas" => "alpaca") ;print "Votre nom ? " ;my $name = <STDIN> ;chomp ($name) ;print "Salut, $name !\n" ;my $secretword = $words{$name} ;print "Quel est le mot de passe ? " ;my $guess = <STDIN> ;chomp $guess ;while ($guess ne $secretword) { print "Faux, essayez encore. Quel est le mot de passe ? "; $guess = <STDIN> ; 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.plmy $stops = 0 ;if ($stops) { print "Arret $stops. \n" ; }else { print "Depart. \n" ; }while ($stops < 5 && $location ne "terminus") { $stops ++ ; print "Prochain arret ? " ; chomp($location = <STDIN>) ; }unless ($stops) { print "Depart. \n" ; }else { print "Arret $stops. \n" ; }until ($stops eq 0) { $stops -- ; print "Prochain arret ? " ; chomp($location = <STDIN>) ; }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.plmy $stops = 0 ;do { $stops ++ ; print "Prochain arret ? " ; chomp($location = <STDIN>) ; }while ($stops < 5 && $location ne "terminus") ;print "Terminus. \n" unless ($stops == 5) ;do { $stops -- ; print "Prochain arret ? " ; chomp($location = <STDIN>) ; }until ($stops eq 0) ;print "Terminus.\n" ;for ($stops = 0 ; $stops < 5 ; $stops ++) { print "Prochain arret ? " ; chomp($location = <STDIN>) ; }print "Terminus. \n" if ($stops == 5) ;
Structures conditionnelles (3/4)
#controle3.plmy $i = 0 ;foreach $i (1,2,3,4,5) { # $i est local а foreach print "Prochain arret ? " ; chomp($location = <STDIN>) ; }print "$i. \n" ; # vaut toujours 0.my @words = ("alpaca", "chameau", "dromadaire", "lama") ;foreach $i (reverse @words) { print "$i" ; }print "\n" ;foreach (reverse @words) { # Variable par defaut print "$_" ; }print "\n" ;foreach (reverse @words) { print ; }print "\n" ;
Structures conditionnelles (4/4)
#lireFichier.plmy $secretword = "lama" ;print "Quel est le mot de passe ? " ;my $guess ;while ($guess=<STDIN>) { 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 (<STDIN>) { # 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.plmy @odd = (1, 3, 5, 7) ;my $string = join(",", @odd) ;print $string, "\n" ;my $line = "merlyn::118:10:Randal:/home/merlyn:/usr/bin/perl:" ;my @fields = split(/:/,$line) ;print "$fields[0], $fields[1], $fields[2]...\n" ;@fields = split(/:+/,$line) ;print "$fields[0], $fields[1], $fields[2]...\n" ;
join, split
#piles.plmy @odd = (1, 3, 5, 7) ;print join(",", @odd), "\n" ;push(@odd, 9, 11, 13) ; #empilerprint join(",", @odd), "\n" ;my $last = pop(@odd) ; #depilerprint join(",", @odd), "\n" ;unshift(@odd, -5, -3, -1) ; #empiler a gaucheprint join(",", @odd), "\n" ;my $first = shift(@odd) ; #depiler a gaucheprint join(",", @odd), "\n" ;
Piles
$aref = \@array; # $aref est maintenant une référence à @array$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 de hachage
@a @{$aref} Un tableaureverse @a reverse @{$aref} 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 hachagekeys %h keys %{$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)