35
CSI 3525, Automne 2001 Une introduction au Perl Preparee 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” 2 nd ed., O’Reilly Randal L. Schwartz and Tom Phoenix, “Learning Perl” 3 rd ed., O’Reilly Nathalie Japkowicz Go O'Reilly!

CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

Embed Size (px)

Citation preview

Page 1: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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!

Page 2: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 3: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 4: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 5: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 6: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 7: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 8: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 9: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 10: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 11: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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…

Page 12: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 13: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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...

Page 14: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 15: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 16: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 17: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 18: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 19: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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";}

Page 20: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 21: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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";}

Page 22: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 23: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 24: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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";}

Page 25: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 26: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 27: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 28: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 29: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 30: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 31: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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

Page 32: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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"

Page 33: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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"

Page 34: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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.

Page 35: CSI 3525, Automne 2001 Une introduction au Perl Preparee par Stan Szpakowicz, base sur ces sources et inspirations: plank/plank/classes/cs494/notes/Perl/lecture.html

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