Upload
roberte-leriche
View
103
Download
0
Tags:
Embed Size (px)
Citation preview
CSI 3525, Automne 2001Une introduction au PerlPreparee par Stan Szpakowicz,
base sur ces sources et inspirations:
http://www.cs.utk.edu/~plank/plank/classes/cs494/notes/Perl/lecture.html Randal L. Schwartz and Tom Christiansen, “Learning Perl” 2nd ed., O’Reilly Randal L. Schwartz and Tom Phoenix, “Learning Perl” 3rd ed., O’Reilly Nathalie Japkowicz
Go O'Reilly!
Perl, page 2CSI 3525
Perl: Survol (1)
Perl = Practical extraction and report language Perl = Pathologically eclectic rubbish lister C’est un langage puissant a usage general, qui
est particulierement utile pour l’ecriture “rapide et sans trop de principes” de programmes (“quick and dirty programs”!)
Le langage a ete invente par Larry Wall, sans excuses pour son manque d’elegance (!)
Si vous connaissez le C et l’Unix, vous pouvez apprendre Perl (ou au moins, un bon morceau de Perl ) en quelques jours.
Perl, page 3CSI 3525
Perl: Survol (2)
Dans la hierarchie des langages de programmation, Perl se trouve a mi-chemin entre les langages de haut-niveau tels que le Pascal, le C et le C++ et les scriptes de coquille (shell scripts) [les langages qui ajoute une structure de controle aux instruction de lignes de controle de l’Unix] tels que sh, sed et awk.
En passant, awk = Aho, Weinberger, Kernighan, et sed = Stream Editor.
Perl, page 4CSI 3525
Les avantages du Perl (1)
Le Perl combine les meilleures caracteristiques (selon ses admirateurs ) de: La programmation de la shell Unix/Linux, Des commandes sed, grep, awk et tr, C, Cobol.
Les Shell scripts sont, habituellement, ecrits dans une multitude de petits fichiers qui se referencient les uns les autres. Perl atteint cette fonctionalite en utilisant un seul fichier.
Perl, page 5CSI 3525
Les avantages du Perl (2)
Le Perl offre des capabilites puissantes pour les expressions regulieres. Ceci permet des operations de prise en charge des chaines de caracteres—en particulier le pattern matching—rapides, flexibles, et fiables.
En consequence, le Perl est particulierement utile pour les applications de traitement de texte. En fait, c’est le Perl qui a permis la transformation de documents en documents HTML au debut des annees 1990, permettant au Web son expansion si rapide.
Perl, page 6CSI 3525
Les Desavantages du Perl
Le Perl est un vrai fouillis! Il contient de nombreuses constructions provenant de nombreux langages et de nombreux outils informatique.
Tres souvent, il contient differentes constructions pour une meme fonctionalite (par example, il existe au moins 5 facons d’executer une commande “if” d’une ligne) Ce n’est pas un langage tres lisible!
Vous ne pouvez pas ditribuer un programme en Perl en tant que fichier binaire opaque. Cela veut dire que vous ne pouvez pas vraiement commercialiser les produits que vous developpez en Perl.
Perl, page 7CSI 3525
Donnees Scalaires: chaines et nombres
Les scalaires n’ont pas besoin d’etre definis ou d’avoir leur type declare: Perl comprend a partir du context.
% cat hellos.pl#!/usr/local/perl5/bin/perl -wprint "Hello" . " " . "world\n";print "hi there " . 2 . " worlds!" ."\n";print (("5" + 6) . " eggs\n" . " in " . " 3 + 2 = " . ("3" + "2") . " baskets\n" );
% hellos.pl
Hello world hi there 2 worlds! 11 eggs in 3 + 2 = 5 baskets
<-- invoke Perl
Perl, page 8CSI 3525
Variables Scalaires
Les variables scalaires debutent avec un signe de dollar. Elles n’ont pas besoin d’etre declarees.
% cat scalar.pl#!/usr/local/perl5/bin/perl -w$i = 1;$j = "2";print "$i and $j \n";$k = $i + $j;print "$k\n";print $i . $j . "\n";print '$k\n' . "\n";
% scalar.pl
1 and 2312$k\n
Perl, page 9CSI 3525
Structures de Control: if, else, elsif
% cat names.pl#!/usr/local/perl5/bin/perl -w$name = <STDIN>;chomp($name);if ($name gt 'fred') { print "'$name' follows 'fred'\n";}elsif ('$name' eq 'fred') { print "both names are 'fred'\n";}else { print "'$name' precedes 'fred'\n";}% names.plStan'Stan' precedes 'fred'% names.plstan'stan' follows 'fred'
<-- my input<-- Perls' output
<-- cut newline
Perl, page 10CSI 3525
Structures de Controle: boucles (1)
% cat oddsum_while.pl#!/usr/local/perl5/bin/perl -w# Add up some odd numbers$max = <STDIN>;$n = 1;while ($n < $max) { $sum += $n; $n += 2; } # On to the next odd numberprint "The total is $sum.\n";% oddsum_while.pl10Use of uninitialized value at oddnums.pl
line 6, <STDIN> chunk 1.The total is 25.
<-- my input
<-- a warning<-- Perl's output
Perl, page 11CSI 3525
Structures de Controle: boucles (2)
• Les commentaires commencent avec #.• Vous pouvez, bien que ce ne soit pas tres
elegant, utiliser une variable sans l’initialiser (comme $sum). Une telle variable sera initialisee a 0 si elle est, au depart, utilisee comme un nombre ou un “” si son premier usage est en tant que chaine. En fait, sa vraie valeur est toujours undef, convertie comme il le faut.
• Si vous le voulez, Perl peut donner des avertissements (le signal -w).
• Bien entendu, while est seulement l’une des constructions de boucles du Perl. Continuons…
Perl, page 12CSI 3525
Structures de Controle: boucles (3)
% cat oddsum_until.pl#!/usr/local/perl5/bin/perl -w# Add up some odd numbers$max = <STDIN>;$n = 1;$sum = 0;until ($n >= $max) { $sum += $n; $n += 2; } # On to the next odd numberprint "The total is $sum.\n";% oddsum_until.pl10The total is 25.
Perl, page 13CSI 3525
Structures de Controle: boucles (4)
% cat oddsum_for.pl#!/usr/local/perl5/bin/perl -w# Add up some odd numbers$max = <STDIN>;$sum = 0;for ($n = 1 ; $n < $max ; $n += 2) { $sum += $n; }print "The total is $sum.\n";% oddsum_for.pl10The total is 25.
Il y a aussi do-while et do-until, et on a foreach. Continuouns...
Perl, page 14CSI 3525
Structures de Controle: boucles (5)
% cat oddsum_foreach.pl#!/usr/local/perl5/bin/perl -w# Add up some odd numbers$max = <STDIN>;$sum = 0;foreach $n ( (1 .. $max) ) { if ( $n % 2 != 0 ) { $sum += $n; }
}print "The total is $sum.\n";% oddsum_foreach.pl10The total is 25.
Perl, page 15CSI 3525
Listes et tableaux Une liste est une collection ordinee de scalaires.
Un tableau est une variable contennant une liste. Chaque element est une valeur scalaire
independante. Une liste peut contenir des nombres, des chaines, des valeurs undef—tout melange de type est permis!
Pour utiliser un element de tableau, prefixez le nom du tableau par un $; placez l’index dans des crochets. Afin d’accer au tableau en entier, prefixez son nom par un @.
Vous pouvez copier un tableau dans un autre. Vous pouvez egalement utiliser les operateurs sort, reverse, push, pop, split.
Perl, page 16CSI 3525
Exemples de Tableaux I% cat arraysort.pl#!/usr/local/perl5/bin/perl -w$i = 0;while ($k = <STDIN>) { $a[$i++] = $k; }print "====== sorted ======\n";print sort(@a);% arraysort.plNathalieFrankhelloJohnZebranotarynil<-- ^D here
====== sorted ======FrankJohnNathalieZebrahellonilnotary
Perl, page 17CSI 3525
Exemples de Tableaux IIa
Reversing a text file (whole lines)
% cat whole_rev.pl#!/usr/local/perl5/bin/perl -wwhile ($k = <STDIN>) { push(@a, $k); }print "=== reversed ===\n";while ($oldval = pop(@a)) { print $oldval; }% whole_rev.pla b c de fg h i=== reversed ===g h ie fa b c d
Perl, page 18CSI 3525
Exemples de Tableaux IIb
% each_rev.pl
a bc d efgefg d bc ahi jj hiklm nopq stst nopq klm
Reversing each line in a text file
% cat each_rev.pl#!/usr/local/perl5/bin/perl -wwhile($k = <STDIN>) { @a = split(/\s+/, $k); $s = ""; for ($i = @a; $i > 0; $i--) {
$s = "$s$a[$i-1] "; } chop($s); print "$s\n"}
output^D
Perl, page 19CSI 3525
Exemples de Tableaux III
Reversing a text file (whole lines)
print reverse(<STDIN>);
Reversing each line in a text file
while($k = <STDIN>) { $s = ""; foreach $i (reverse(split(/\s+/, $k))) { $s = "$s$i "; } chop($s); print "$s\n";}
Perl, page 20CSI 3525
Hashes
un hash est comme un tableau, mais a la place d’indices, on peut avoir n’importe quelle cle, et on utilise des accolades plutot que des crochets.
Le nom officiel est tableau associatif (implemente par du hashing ).
Les cles et le valeurs peuvent etre n’importe quel scalaire; Les cles sont toujours converties en chaines.
Afin de referer a un hash en entier il faut prefixer son nom d’un %.
Si vous affectez un hash a un tableau, il devient une simple liste.
Perl, page 21CSI 3525
Hash: exemples I (1)
% cat hash_array.pl#!/usr/local/perl5/bin/perl -w%some_hash = ("foo", 35, "bar", 12.4, 2.5, "hello", "wilma", 1.72e30, "betty", "bye\n");@an_array = %some_hash;print "@an_array\n========\n";foreach $key (keys %some_hash){ print "$key: "; print delete $some_hash{$key}; print "\n";}
Perl, page 22CSI 3525
Hash: exemples I (2)
% hash_array.plbetty bye wilma 1.72e+30 foo 35 2.5 hello bar 12.4
========betty: bye
wilma: 1.72e+30foo: 352.5: hellobar: 12.4
Perl, page 23CSI 3525
Hash: exemples II
% cat hash_arrows.pl#!/usr/local/perl5/bin/perl -wmy %hash = ( "a" => 1, "b" => 2, "c" => 3);foreach $key (sort keys %hash) { $value = $hash{$key}; print "$key => $value\n";}% hash_arrows.pla => 1b => 2c => 3
Perl, page 24CSI 3525
Hash: exemples III: Compte de frequence de caracteres
% cat frequency.pl#!/usr/local/perl5/bin/perl -wwhile (<>) { # loop over chars in input line for $c (split //) { # Increment $count of $c ++$count{$c};} }# end of input, print %countfor $c (sort keys %count) { print "$c\t$count{$c}\n";}
Perl, page 25CSI 3525
Hash: exemples III: Compte de frequence de caracteres
% frequency.plNathalieFranhelloJohnratherNotaryF 1J 1
^D
8 21 2F 2J 2N 2a 5e 3h 4i 1l 3n 2o 3r 4t 3y 1
Perl, page 26CSI 3525
Expressions Regulieres I
Une expression reguliere (ou pattern) est un patron decrivant une classe de chaines. Une chaine peut correspondre ou ne pas correspondre a ce patron. Les patrons les plus simples sont d’un seul caractere.
Une class de caracteres s’ecrit entre crochets: [01234567] un chiffre octal [0-7] un chiffre octal [0-9A-F] un chiffre hex [^A-Za-z] pas une lettre [0-9-] un chiffre decimal ou un
moins.
Perl, page 27CSI 3525
Expressions Regulieres II Metacaracteres:
. (dot) n’importe quel caractere sauf \n
Anchors: ^ le debut d’une $ la fin d’une chaine
Multiplicateurs: * repete l’item precedent 0 ou plus
de fois + repete l’item precedent 1 ou plus
de fois ? rend l’item precedent optionnel {n} repete n fois {n, m} repete n a m fois (n <= m) {n,} repete n ouplus de fois
Perl, page 28CSI 3525
Expressions Regulieres III L’operateur Booleen =~ fait correspondre
une chaine a une expression reguliere, que l’on ecrit entre deux barres inclinees.
Les patrons peuvent etre groupes dans des parentheses (le patron en entier devient un item). Les alternatives sont denotees par la barre droite |. $x = "01239876AGH";if ( $x =~ /([0-9]{4}|[A-Z]{3}){2,}/ ){ print "yes1\n"; }if ( $x =~ /(0?|4)(5|[1abc]{1,})/ ){ print "yes2\n"; }
Sera explique dans un moment
Perl, page 29CSI 3525
Expressions Regulieres IV
La precedence des elements d’un patron: parentheses ( ) multiplicateurs * + ? {n} sequence, ancres ^ $ alternation |
Certaines classes de caracteres sont predefinies:
class Cnot C
chiffre \d \D mot char [a-zA-Z0-9_]+ \w \W espace blanc \s \S
Des ancres additionnelles: word boundary \b \B
Perl, page 30CSI 3525
Expressions Regulieres: exemples I
$i = "Jim"; Correspondence
$i =~ /Jim/; oui$i =~ /J/; oui$i =~ /j/; non$i =~ /j/i; oui$i =~ /\w/; oui$i =~ /\W/; nonMajuscule/Minuscule ignore si on utilise le i postfixe.
Perl, page 31CSI 3525
Expressions Regulieres: exemples II
$j = "JjJjJjJj";
$j =~ /j*/; oui: corresponds a tout$j =~ /j+/; oui: correspond au premier j$j =~ /j?/; oui: correspond au premier j $j =~ /j{2}/; non$j =~ /j{2}/i; oui: ignore les Majusc./Minusc.$j =~ /(Jj){3}/; oui: corresponds a la chaine
entiere
Perl, page 32CSI 3525
Expressions Regulieres: exemples III
$k = "Boom Boom, out go the lights!";
$k =~ /Jim|Boom/; oui: corresponds a Boom$k =~ /(Boom){2}/; non: espace entre Booms$k =~ /(Boom ){2}/; non: a cause de la virgule $k =~ /(Boom\W){2}/; oui $k =~ /\bBoom\b/; oui: montre les limites de
mots$k =~ /\bBoom.*the\b/; oui $k =~ /\Bgo\B/; non: "go" est un mot$k =~ /\Bgh\B/; oui: le "gh" dans "lights"
Perl, page 33CSI 3525
Expressions Regulieres: Substitution I
Vous pouvez modifier une variable de type chaine de caractere en appliquant une substitution. L’operateur est de nouveau =~, et la substitution s’ecrit de la facon suivante:
s/pattern1/pattern2/
$j = "Jim Plank";$j devient:
$j =~ s/ .*/i Hendrix/; Jimi Hendrix$j =~ s/i/I/g; JImI HendrIx$j =~ s/\b\w*\b/Dikembe/; Dikembe HendrIx$j =~ s/(\b\w*\b).*/J\. "\1"/; J. "Dikembe"
Perl, page 34CSI 3525
Expressions Regulieres: Substitution II
$j = "Jim Plank";$j devient
$j =~ s/(\w*) (\w*)/\1 \1 \2/; Jim Jim Plank
$i = "I am the the man";$i devient
$i =~ s/(\b\w+\b) \1/\1/; I am the man(pourquoi?)
Afin d’expliquer J. "Dikembe", nous devons expliquerLes parentheses en tant que memoire.
Perl, page 35CSI 3525
Dans un autre cours
Variables predefinies (il y en a plein!) Plus de detail sur les listes, tableaux et
hashes Plus de detail sur les expressions
regulieres Fonctions definies par l’usager Gestion de Fichiers Gestion de Directoires Gestion de Processus Capabilites pour gestion de bases de
donnees en Perl Programmation CGI