Title: CSI 3525, Automne 2001
1- 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/n
otes/Perl/lecture.html - Randal L. Schwartz and Tom Christiansen,
Learning Perl 2nd ed., OReilly - Randal L. Schwartz and Tom Phoenix, Learning
Perl 3rd ed., OReilly - Nathalie Japkowicz
Go O'Reilly!
2Perl Survol (1)
- Perl Practical extraction and report language
- Perl Pathologically eclectic rubbish lister
- Cest un langage puissant a usage general, qui
est particulierement utile pour lecriture
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 delegance (!) - Si vous connaissez le C et lUnix, vous pouvez
apprendre Perl (ou au moins, un bon morceau de
Perl ?) en quelques jours.
3Perl 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 lUnix tels
que sh, sed et awk. - En passant, awk Aho, Weinberger, Kernighan, et
sed Stream Editor.
4Les 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.
5Les 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
caracteresen particulier le pattern
matchingrapides, flexibles, et fiables. - En consequence, le Perl est particulierement
utile pour les applications de traitement de
texte. En fait, cest le Perl qui a permis la
transformation de documents en documents HTML au
debut des annees 1990, permettant au Web son
expansion si rapide.
6Les 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 dexecuter
une commande if dune ligne) ? Ce nest 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.
7Donnees Scalaires chaines et nombres
- Les scalaires nont pas besoin detre definis ou
davoir leur type declare Perl comprend a partir
du context. - cat hellos.pl
- !/usr/local/perl5/bin/perl -w
- print "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
lt-- invoke Perl
8Variables Scalaires
- Les variables scalaires debutent avec un signe de
dollar. Elles nont pas besoin detre 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 2 3 12 k\n
9Structures de Control if, else, elsif
- cat names.pl
- !/usr/local/perl5/bin/perl -w
- name ltSTDINgt
- 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.pl
- Stan
- 'Stan' precedes 'fred'
- names.pl
- stan
- 'stan' follows 'fred'
lt-- cut newline
lt-- my input lt-- Perls' output
10Structures de Controle boucles (1)
- cat oddsum_while.pl
- !/usr/local/perl5/bin/perl -w
- Add up some odd numbers
- max ltSTDINgt
- n 1
- while (n lt max)
- sum n
- n 2 On to the next odd number
- print "The total is sum.\n"
- oddsum_while.pl
- 10
- Use of uninitialized value at oddnums.pl line 6,
ltSTDINgt chunk 1. - The total is 25.
lt-- my input lt-- a warning lt-- Perl's output
11Structures de Controle boucles (2)
- Les commentaires commencent avec .
- Vous pouvez, bien que ce ne soit pas tres
elegant, utiliser une variable sans linitialiser
(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 lune des
constructions de boucles du Perl. Continuons
12Structures de Controle boucles (3)
- cat oddsum_until.pl
- !/usr/local/perl5/bin/perl -w
- Add up some odd numbers
- max ltSTDINgt
- n 1
- sum 0
- until (n gt max)
- sum n
- n 2 On to the next odd number
- print "The total is sum.\n"
- oddsum_until.pl
- 10
- The total is 25.
13Structures de Controle boucles (4)
- cat oddsum_for.pl
- !/usr/local/perl5/bin/perl -w
- Add up some odd numbers
- max ltSTDINgt
- sum 0
- for (n 1 n lt max n 2)
- sum n
- print "The total is sum.\n"
- oddsum_for.pl
- 10
- The total is 25.
- Il y a aussi do-while et do-until, et on a
foreach. Continuouns...
14Structures de Controle boucles (5)
- cat oddsum_foreach.pl
- !/usr/local/perl5/bin/perl -w
- Add up some odd numbers
- max ltSTDINgt
- sum 0
- foreach n ( (1 .. max) )
- if ( n 2 ! 0 ) sum n
- print "The total is sum.\n"
- oddsum_foreach.pl
- 10
- The total is 25.
15Listes 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 undeftout
melange de type est permis! - Pour utiliser un element de tableau, prefixez le
nom du tableau par un placez lindex dans des
crochets. Afin daccer au tableau en entier,
prefixez son nom par un _at_. - Vous pouvez copier un tableau dans un autre. Vous
pouvez egalement utiliser les operateurs sort,
reverse, push, pop, split.
16Exemples de Tableaux I
- cat arraysort.pl
- !/usr/local/perl5/bin/perl -w
- i 0
- while (k ltSTDINgt)
- ai k
- print " sorted \n"
- print sort(_at_a)
- arraysort.pl
- Nathalie
- Frank
- hello
- John
- Zebra
- notary
- nil
sorted Frank John Nathalie Zebra hel
lo nil notary
lt-- D here
17Exemples de Tableaux IIa
- Reversing a text file (whole lines)
- cat whole_rev.pl
- !/usr/local/perl5/bin/perl -w
- while (k ltSTDINgt) push(_at_a, k)
- print " reversed \n"
- while (oldval pop(_at_a)) print oldval
- whole_rev.pl
- a b c d
- e f
- g h i
- reversed
- g h i
- e f
- a b c d
18Exemples de Tableaux IIb
Reversing each line in a text file
cat each_rev.pl !/usr/local/perl5/bin/perl
-w while(k ltSTDINgt) _at_a split(/\s/,
k) s "" for (i _at_a i gt 0 i--)
s "sai-1 " chop(s) print
"s\n"
- each_rev.pl
- a bc d efg
- efg d bc a
- hi j
- j hi
- klm nopq st
- st nopq klm
D
output
19Exemples de Tableaux III
- Reversing a text file (whole lines)
- print reverse(ltSTDINgt)
- Reversing each line in a text file
- while(k ltSTDINgt)
- s ""
- foreach i
- (reverse(split(/\s/, k)))
- s "si "
- chop(s)
- print "s\n"
-
20Hashes
- un hash est comme un tableau, mais a la place
dindices, on peut avoir nimporte 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 nimporte
quel scalaire Les cles sont toujours converties
en chaines. - Afin de referer a un hash en entier il faut
prefixer son nom dun . - Si vous affectez un hash a un tableau, il devient
une simple liste.
21Hash 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")
- _at_an_array some_hash
- print "_at_an_array\n\n"
- foreach key (keys some_hash)
- print "key "
- print delete some_hashkey
- print "\n"
22Hash exemples I (2)
- hash_array.pl
- betty bye
- wilma 1.72e30 foo 35 2.5 hello bar 12.4
-
- betty bye
- wilma 1.72e30
- foo 35
- 2.5 hello
- bar 12.4
23Hash exemples II
- cat hash_arrows.pl
- !/usr/local/perl5/bin/perl -w
- my hash
- ( "a" gt 1, "b" gt 2, "c" gt 3)
- foreach key (sort keys hash)
- value hashkey
- print "key gt value\n"
-
- hash_arrows.pl
- a gt 1
- b gt 2
- c gt 3
24Hash exemples III Compte de frequence de
caracteres
- cat frequency.pl
- !/usr/local/perl5/bin/perl -w
- while (ltgt)
- loop over chars in input line
- for c (split //)
- Increment count of c
- countc
-
- end of input, print count
- for c (sort keys count)
- print "c\tcountc\n"
25Hash exemples III Compte de frequence de
caracteres
8 2 1 2 F 2 J
2 N 2 a 5 e 3 h 4 i
1 l 3 n 2 o 3 r 4 t
3 y 1
- frequency.pl
- Nathalie
- Fran
- hello
- John
- rather
- Notary
- F 1
- J 1
D
26Expressions 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 dun
seul caractere. - Une class de caracteres secrit 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.
27Expressions Regulieres II
- Metacaracteres
- . (dot) nimporte quel caractere sauf \n
- Anchors
- le debut dune
- la fin dune chaine
- Multiplicateurs
- repete litem precedent 0 ou plus de fois
- repete litem precedent 1 ou plus de fois
- ? rend litem precedent optionnel
- n repete n fois
- n, m repete n a m fois (n lt m)
- n, repete n ouplus de fois
28Expressions Regulieres III
- Loperateur Booleen fait correspondre une
chaine a une expression reguliere, que lon 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-94A-Z3)2,/ )
- print "yes1\n"
- if ( x /(0?4)(51abc1,)/ )
- print "yes2\n"
Sera explique dans un moment
29Expressions Regulieres IV
- La precedence des elements dun patron
- parentheses ( )
- multiplicateurs ? n
- sequence, ancres
- alternation
- Certaines classes de caracteres sont predefinies
- class C not C
- chiffre \d \D
- mot char a-zA-Z0-9_ \w \W
- espace blanc \s \S
- Des ancres additionnelles
- word boundary \b \B
30Expressions Regulieres exemples I
- i "Jim"
- Correspondence
- i /Jim/ oui
- i /J/ oui
- i /j/ non
- i /j/i oui
- i /\w/ oui
- i /\W/ non
- Majuscule/Minuscule ignore si on utilise le i
postfixe.
31Expressions 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 /j2/ non
- j /j2/i oui ignore les Majusc./Minusc.
- j /(Jj)3/ oui corresponds a la chaine
entiere
32Expressions Regulieres exemples III
- k "Boom Boom, out go the lights!"
- k /JimBoom/ 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"
33Expressions Regulieres Substitution I
- Vous pouvez modifier une variable de type chaine
de caractere en appliquant une substitution.
Loperateur est de nouveau , et la substitution
secrit 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"
34Expressions Regulieres Substitution II
Afin dexpliquer J. "Dikembe", nous devons
expliquer Les parentheses en tant que memoire.
- 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?)
35Dans 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 lusager
- Gestion de Fichiers
- Gestion de Directoires
- Gestion de Processus
- Capabilites pour gestion de bases de donnees en
Perl - Programmation CGI