Perl pour physiciens Nicolas Regnault Laboratoire Pierre Aigrain 23 novembre 2004 Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 1 / 24
Plan du cours : introduction les variables les tableaux les fichiers les expressions régulières les fonctions hygiène et programmation (les 10 commandements) PERL maître du monde Exemples à la demande Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 2 / 24
Plan du cours : introduction les variables les tableaux les fichiers les expressions régulières les fonctions hygiène et programmation (les 10 commandements) PERL maître du monde Exemples à la demande Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 2 / 24
Chapitre 5 : Les expressions régulières Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 3 / 24
Reconnaissance de formes Pourquoi dans ce cas s infliger les expressions régulières? composée d un certain nombre de caractères quatre chiffres extension.dat Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 4 / 24
Reconnaissance de formes Pourquoi dans ce cas s infliger les expressions régulières? composée d un certain nombre de caractères quatre chiffres extension.dat if ($chaine = /\d\d\d\d\.dat$/) Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 4 / 24
Reconnaissance de formes Pourquoi dans ce cas s infliger les expressions régulières? composée d un certain nombre de caractères quatre chiffres extension.dat if ($chaine = /\d\d\d\d\.dat$/) Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 4 / 24
Reconnaissance de formes Pourquoi dans ce cas s infliger les expressions régulières? composée d un certain nombre de caractères quatre chiffres extension.dat if ($chaine = /\d\d\d\d\.dat$/) Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 4 / 24
Reconnaissance de formes tous les caractères alphanumériques espace. n importe quel caractère (sauf \n) \d n importe quel chiffre \w n importe quel caractère alphanumérique \s n importe quel type d espace \. le caractère. \\ le caractère \ idem pour presque tous les caractères non alphanumériques Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 5 / 24
Reconnaissance de formes groupe explicite [abcde] groupe avec intervalle [a-e] groupe avec plusieurs intervalles [a-ea-e] complémentaire d un groupe [ˆa-eA-E] Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 6 / 24
Reconnaissance de formes ancrage de motif : /ˆ.../ ancrage en début de ligne. /...$/ ancrage en fin de ligne. Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 7 / 24
Reconnaissance de formes ancrage de motif : /ˆ.../ ancrage en début de ligne. /...$/ ancrage en fin de ligne. if ($chaine = /\\d\\d\\d\\d\.dat$/) Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 7 / 24
Reconnaissance de formes nombre d occurences : * zéro, une ou plusieurs apparitions + doit apparaître au moins une fois.? doit apparaître au plus une fois. {x} doit apparaître x fois. {x,y} doit apparaître au moins x fois et au plus y fois. Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 8 / 24
Reconnaissance de formes dynamique.pl #!/usr/bin/perl $chaine = qhe001.dat ; $expression = \d*\.dat\$ ; if ($chaine = /\b$expression\b/) { print ($chaine. verifie l expression reguliere.$expression. \n ) ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 9 / 24
Reconnaissance de formes dynamique.pl #!/usr/bin/perl $chaine = qhe001.dat ; $expression = \d*\.dat\$ ; if ($chaine = /\b$expression\b/) { print ($chaine. verifie l expression reguliere.$expression. \n ) ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 9 / 24
Reconnaissance de formes dynamique.pl #!/usr/bin/perl $chaine = qhe001.dat ; $expression = \d*\.dat\$ ; if ($chaine = /\b$expression\b/) { print ($chaine. verifie l expression reguliere.$expression. \n ) ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 9 / 24
Reconnaissance de formes Ecrivez un programme qui recherche dans tous les fichiers ayant l extension txt (vous vous assurerez qu il s agit bien d un fichier), ceux qui contiennent une chaîne de caractères simple (uniquement des chiffres et des lettres sans espaces ni caractères spéciaux). Cette chaîne sera donnée par le premier argument du programme. Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 10 / 24
Substituer un motif substitution1.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto/tata/ ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 11 / 24
Substituer un motif substitution1.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto/tata/ ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 11 / 24
Substituer un motif substitution1.pl #!/usr/bin/perl $fichier = toto1984toto.dat ; $fichier = s/toto/tata/ ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 11 / 24
Substituer un motif Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 12 / 24
Substituer un motif substitution1.pl #!/usr/bin/perl $fichier = toto1984toto.dat ; $fichier = s/toto/tata/ ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 13 / 24
Substituer un motif substitution1.pl #!/usr/bin/perl $fichier = toto1984toto.dat ; $fichier = s/toto/tata/g ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 13 / 24
Substituer un motif substitution2.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto// ; $fichier = s/\.dat// ; $fichier += 100 ; $fichier = toto.$fichier..dat ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 14 / 24
Substituer un motif substitution2.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto// ; $fichier = s/\.dat// ; $fichier += 100 ; $fichier = toto.$fichier..dat ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 14 / 24
Substituer un motif substitution2.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto// ; $fichier = s/\.dat// ; $fichier += 100 ; $fichier = toto.$fichier..dat ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 14 / 24
Substituer un motif substitution2.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto(\d*)\.dat/$1/ ; $fichier += 100 ; $fichier = toto.$fichier..dat ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 15 / 24
Substituer un motif substitution2.pl #!/usr/bin/perl $fichier = toto1984.dat ; $fichier = s/toto(\d*)\.dat/$1/ ; $fichier += 100 ; $fichier = toto.$fichier..dat ; print ($fichier. \n ) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 15 / 24
Substituer un motif #!/usr/bin/perl $nomfichier = $ARGV[0] ; $contenu = ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } while ($ligne = <INFILE>) { $ligne = s/ /\ /g ; $contenu.= $ligne ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 16 / 24
Substituer un motif #!/usr/bin/perl $nomfichier = $ARGV[0] ; $contenu = ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } while ($ligne = <INFILE>) { $ligne = s/ /\ /g ; $contenu.= $ligne ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 16 / 24
Substituer un motif #!/usr/bin/perl $nomfichier = $ARGV[0] ; $contenu = ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } while ($ligne = <INFILE>) { $ligne = s/ /\ /g ; $contenu.= $ligne ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 16 / 24
Substituer un motif #!/usr/bin/perl $nomfichier = $ARGV[0] ; $contenu = ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } while ($ligne = <INFILE>) { $ligne = s/ /\ /g ; $contenu.= $ligne ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 16 / 24
Substituer un motif #!/usr/bin/perl $nomfichier = $ARGV[0] ; $contenu = ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } while ($ligne = <INFILE>) { $ligne = s/ /\ /g ; $contenu.= $ligne ; } Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 16 / 24
Substituer un motif close (INFILE) ; unless (open (OUTFILE, >.$nomfichier)) { die ( impossible d ouvrir.$nomfichier. en ecriture\n ) ; } print OUTFILE $contenu ; close (OUTFILE) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 17 / 24
Substituer un motif Ecrivez un premier programme qui crée un certain nombre de fichiers donné par le premier argument du programme, et ayant pour nom qhexxx.dat (xxx allant de 0 au nombre donné moins un). Chaque fichier contiendra son propre nom. Ecrivez un second programme qui recherche dans un répertoire tous les fichiers de la forme qhe\d*\.dat et qui les renomme en fqhe\d*\.dat. Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 18 / 24
Substituer un motif monde DOS/Windows :deux caractères ASCII pour le saut de ligne (\r et \n) monde UNIX : un caractère ASCII pour le saut de ligne (\n) Ecrivez un programme dos2unix.pl qui convertit un fichier dont le nom est donné par le premier argument de la commande, du standard DOS/Windows au format UNIX. Ecrivez un programme unix2dos.pl qui fait l opération inverse. Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 19 / 24
Le duo comique split et join @tableau=split(/ /, $ligne) ; premier argument = expression régulière qui permet de reconnaître le séparateur euxième argument = ligne à découper Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 20 / 24
Le duo comique split et join $ligne=join(, @tableau) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 21 / 24
Le duo comique split et join #!/usr/bin/perl $nomfichier = $ARGV[0] ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } $ligne = <INFILE> ; chomp ($ligne) ; @valeurx = split (/ /, $ligne) ; $ligne = <INFILE> ; chomp ($ligne) ; @valeury = split (/ /, $ligne) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 22 / 24
Le duo comique split et join #!/usr/bin/perl $nomfichier = $ARGV[0] ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } $ligne = <INFILE> ; chomp ($ligne) ; @valeurx = split (/ /, $ligne) ; $ligne = <INFILE> ; chomp ($ligne) ; @valeury = split (/ /, $ligne) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 22 / 24
Le duo comique split et join #!/usr/bin/perl $nomfichier = $ARGV[0] ; unless (open (INFILE, $nomfichier)) { die ( impossible d ouvrir.$nomfichier. en lecture\n ) ; } $ligne = <INFILE> ; chomp ($ligne) ; @valeurx = split (/ /, $ligne) ; $ligne = <INFILE> ; chomp ($ligne) ; @valeury = split (/ /, $ligne) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 22 / 24
Le duo comique split et join close (INFILE) ; unless (open (OUTFILE, >.$nomfichier)) { die ( impossible d ouvrir.$nomfichier. en ecriture\n ) ; } $iter = 0 ; foreach $ligne (@valeurx) { print OUTFILE ($ligne..$valeury[$iter]. \n ) ; $iter++ ; } close (OUTFILE) ; Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 23 / 24
Le duo comique split et join Ecrivez un premier programme qui crée un fichier un fichier de nombres aléatoires organisés en x colonnes et y lignes (x et y seront passés en paramètres au programme). Ecrivez un deuxième programme qui cherche le maximum de la première colonne, puis divise tous les nombres par ce maximum et finalement remplace l ancien contenu du fichier par les données renormalisées. Nicolas Regnault (Laboratoire Pierre Aigrain) Perl pour physiciens 23 novembre 2004 24 / 24