La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Perl : Notions avancées Expressions rationnelles/régulières Utilisation en Perl Tableaux associatifs Fonctions prédéfinies.

Présentations similaires


Présentation au sujet: "1 Perl : Notions avancées Expressions rationnelles/régulières Utilisation en Perl Tableaux associatifs Fonctions prédéfinies."— Transcription de la présentation:

1 1 Perl : Notions avancées Expressions rationnelles/régulières Utilisation en Perl Tableaux associatifs Fonctions prédéfinies

2 2 Perl : expressions régulières Perl offre une grande puissance de manipulation d'expressions régulières. En Perl on utilise les expression régulières en tant que motifs de recherche. On utilise l'opérateur conditionnel =~ qui signifie « ressemble à » (matches). Syntaxe : $chaîne =~ /expression/ Exemple : if ($nom =~ /^[Dd]upon/) {print "OK !";} => Ok si nom est 'dupont', 'dupond', 'Dupont-Lassoeur' ^ signifie « commence par » On peut rajouter i derrière l'expression pour signifier qu'on ne différencie pas les majuscules des minuscules. Le contraire de l'opérateur =~ est !~ (ne ressemble pas à...) if ($nom !~ /^dupon/i) {print "Non...";}

3 3 \s = espace ou tabulation ou retour-chariot « white space » \n = retour-chariot \t = tabulation ^ = début de chaîne $ = fin de chaîne a = a. = un caractère quelconque (sauf fin de ligne) Documentation complète: « perldoc perlre » ou ou Perl : expressions régulières

4 4 [a-z] tout caractère minuscule [aeiouy] toute voyelle [a-zA-Z0-9] tout caractère alphanumérique ^ au début d'un ensemble indique le complément de l'ensemble [^0-9] tout caractère non numérique \w un caractère alphanumérique ou _ (sans à, é, etc.) \W tout sauf un \w \dun chiffre (= [0-9] ) \Dtout sauf un \d (= [^0-9] ) \Stout sauf un \s \bdébut ou fin dun mot, soit entre \w et \W ou vice versa (utile surtout en anglais)

5 5 Perl : expressions régulières Quelques opérateurs : « ? » 0 ou 1 fois, a? = 0 ou 1 a « * » 0 fois ou plus, a* = 0 ou plusieurs a « + » 1 fois ou plus, a+ = 1 ou plusieurs a (ab) + = 1 ou plusieurs ab « | » : ou (inclusif) a|b = a ou b [^abc] tous caractères qui ne sont pas a ou b ou c {n,m} de n à m fois a{1,4} = 1 à 4 a {n,} n fois ou plus a{3,} = 3 a ou plus

6 6 Perl : expressions régulières Remarque : Si l'on veut qu'un méta-caractère apparaisse tel quel, il faut le précéder d'un « back-slash » (\). Les méta-caractères sont :. ^ | ( ) [ ] { } \ / $ + * ? ex : if (/\(.*\)/) {print;} affiche toute ligne contenant des parenthèses

7 7 Perl : expressions régulières – exemples Pour vérifier si une chaîne $x contient la chaîne "abc'' if ($x =~ /abc/) {... } Pour vérifier si une chaîne $x commence par la chaîne "abc'' if ($x =~ /^abc/) {... } Pour vérifier si une chaîne $x commence par une majuscule if ($x =~ /^[A-Z]/) {... } Pour vérifier si une chaîne $x ne commence pas par une minuscule if ($x =~ /^[^a-z]/) {... } Ici le premier ^ signifie le début de la chaîne, tandis que le deuxième ^ à l'intérieur des crochets indique le complément de l'ensemble indiqué.

8 8 Perl : Remplacement Perl permet de faire des remplacements sur une chaîne des caractères, en utilisant la syntaxe : $chaîne =~ s/motif/remplacement/; où motif est une expression régulière et remplacement ce qui remplace. Exemples : $fruit =~ s/e$/es/; remplace un e final par es $tel =~ s/^99\./02.99\./; remplace des numéros de téléphone par une nouvelle numérotation

9 9 Perl : Remplacement On peux référencer une partie du motif dans le remplacement avec $1 ($1 est une variable correspondant au contenu de la première parenthèse). Exemple : Transformer automatiquement les noms d'arbres par « arbre à fruit » $texte =~ s/([a-z]+)ier /arbre à $1es /; 'cerisier' sera traduit par 'arbre à cerises' (contenu de $1 => 'ceris') 'manguier' => 'arbre à mangues' $2 correspond à la deuxième parenthèse, $3 à la troisième etc. Les options s/exp/remp/i; => Indifférenciation minuscules/majuscules s/exp/remp/g; => Remplace toutes les occurrences (pas seulement la première) Exemple : Pour remplacer un texte par le même en majuscule ( \U ) s/([a-z])/\U$1/g;

10 10 Perl : Remplacement Pour remplacer les suites de plusieurs a en un seul a : $x =~ s/a+/a/g; Pour enlever les suites de a : $x =~ s/a*//g; Ou tout simplement : $x =~ s/a//g; Pour enlever les espaces au début d'une chaîne : $x =~ s/^\s+//; Et à la fin de la chaîne : $x =~ s/\s+$//;

11 11 Perl : Remplacement – exemple complexe Supposons quon ait un texte en anglais américain étiqueté et quon veuille le convertir en anglais britannique. Plus précisément, on veut trouver les verbes en « -ize » et les réécrire « -ise », mais seulement ceux avec un radical dau moins 5 lettres. Par exemple : USA : Analyzing the situation, he finalized his conclusions and sized the problem. R.U. : Analysing the situation, he finalised his conclusions and sized the problem. Le texte étant étiqueté, lentrée du programme sera : Analyzing/VBG the/DT situation/NN,/, he/PRP finalized/VBD his/PRP$ conclusions/NNS and/CC sized/VBD the/DT problem/NN./.

12 12 Perl : Remplacement – exemple complexe Première solution : Solution avancée et plus facile à lire :

13 13 Perl : Remplacement – exemple complexe Première solution (corrigée): s/(^| )(\w{4,}[b-df-hj-np-tv-xz][iy])z(e|es|ed|ing)\/VB/$1$2s$3\/VB/g; Solution avancée et plus facile à lire : s/ \b# début du mot (\w{4,})# $1 : 4 lettres ou plus ([b-df-hj-np-tv-xz][iy]) # $2 : un consonne et i ou y z# le z (e|es|ed|ing)# $3 : terminaison conjuguée (?=\/VB)# assertion « vide » : étiquette dun verbe /$1$2s$3/gx;

14 14 Les tableaux associatifs Les tableaux sont des structures qui consistent de paires de clés et valeurs. La clé est toujours un index numérique. Les index sont consécutifs. Les tableaux associatifs sont des structures qui consistent de paires de clés et valeurs où les clés ne sont pas nécessairement numériques ni consécutives (et donc sans ordre prédéfini). Ils sont toujours précédés du caractère % : my %prix = (amande, 30, fraise, 9, cerise, 25); ou my %prix = (amande => 30, fraise => 9, cerise => 25); On fait ensuite référence à un élément du tableau par : $prix{cerise}

15 15 Les tableaux associatifs Exemples : my %chiffre = (); $chiffre{un} = 1; $chiffre{deux} = 2; print $chiffre{deux};=> 2 my $var = un; print $chiffre{$var}; => 1 Remarque les tableaux associatifs utilisent les accolades, tandis que les tableaux utilisent les crochets. Donc, $x{2} retourne la valeur associée à la clé 2 dans le tableau associatif %x, tandis que $x[2] retourne le troisième élément du Attention : et %x peuvent exister en même tempsce sont trois variables distinctes!

16 16 Les tableaux associatifs Pour afficher toutes les clefs et les valeurs d'un tableau associatif, while ( my ($key,$val) = each %thearray ) { print $key, " ", $val, "\n"; } ou foreach my $key ( keys %prix ) { print $key, " ", $prix{$key}, "\n"; } Le code utilisant « each » est un peu plus rapide, mais celui utilisant « keys » permet de trier les clés avant de les imprimer : foreach my $key ( sort keys %prix ) { print $key, " ", $prix{$key}, "\n"; }

17 17 Exemple – fréquence des mots d'un texte #!/usr/bin/perl -w use strict; use warnings; # toujours utiliser ces deux instructions!!! $/ = "";# unité de travail : le paragraphe my %wordcount; while (<>){ s/-\n//g;# enlever les tirets tr/A-Z/a-z/;# minusculiser = split /\W*\s+\W*/, $_; foreach my $word { $wordcount{$word}++; } foreach my $word (sort keys (%wordcount)) { printf "%20s,%d\n",$word,$wordcount{$word}; }

18 18 Exemple – fréquence des bigrammes d'un texte #!/usr/bin/perl -w use strict; use warnings; $/ = ""; my %wordcount; while (<>) { s/-\n//g;s/^\s+//; tr/A-Z/a-z/; = split /\W*\s+\W*/, $_; for ( my $count = 0; $count <= $#words-1; $count++ ) { $wordcount{"$words[$count] $words[$count+1]"}++; } foreach $wordpair (sort keys %wordcount) { printf "%20s,%d\n", $wordpair, $wordcount{$wordpair}; }

19 19 Exemple – fréquence des terminaisons (3 cars) my %ending; while(<>) { s/^\s+//; = split(/\s+/,$_); foreach my $count (0.. $#words) { # syntaxe plus pratique que for = split(//,$words[$count]); # on split sans séparateur # le résultat est un tableau de caractères if ($#chars > 1) { # on vérifie qu'il y ait au moins trois caractères $ending{$chars[$#chars-2]. " ". $chars[$#chars-1]. " ". $chars[$#chars]}++; } } } foreach my $end (sort keys %ending) { printf "%20s,%d\n", $end, $ending{$end}; }

20 20 Exemple – POS stripping Étant donné un texte étiqueté avec partie du discours (Parts-Of-Speech) The/det boy/noun ate/verb... enlever les partie du discours while(<>) { s/^\s+//; = split; # paramètres implicites: (/\s+/,$_); for (my $count=0; $count<=$#words; ++$count) { my $word = $words[$count]; # mais il faut enlever l'étiquette $word =~ s/\/.*$//; # si une chaîne commence avec un slash, et elle comporte # une suite de caractères, la remplacer avec la chaîne # vide. Ne pas oublier : il faut annuler linterprétation # habituelle du méta-caractère / en le précédant de \. print $word, " "; } print "\n"; }

21 21 Exemple – mots stripping Étant donné un texte étiqueté avec partie du discours (Parts-Of-Speech) The/det boy/noun ate/verb... enlever les mots et retourner les parties du discours while(<>) { s/^\s+//; = split; foreach my $word {# syntaxe encore plus simple $word =~ s/^.*\///; # enlever le mot lui-même print $word, " " ; } print " \n " ; }

22 22 Exemple – le mot le plus long dans un texte my $maxlength = 0; my $longestword; while(<>) { = split(/\s+/,$_); foreach my $word = split(//,$word); if ($#chars > $maxlength) { $maxlength = $#chars; $longestword = $word; } } } $maxlength++; #il faut ajouter 1, car lindice commence à 0 print "$longestword $maxlength\n";

23 23 Exemple – trigrammes #!/usr/bin/perl –w use strict; use warnings; $/ = ""; # Tallies trigrams in each line Parens are ignored # Default input from STDIN Default output to STDOUT. my %count; while (<>) { s/\(/ /g; s/\)/ /g; # remove parens and tokenize = split; # split on whitespace # count trigrams for (my $i=0; $i - 2; $i++) { # - 2??? $count{"$token[$i] $token[$i+1] $token[$i+2]"}++; } # output while (my ($key, $value) = each %count) { print "$value $key\n"; }

24 24 Exemple – 4-grammes #!/usr/bin/perl -w use strict; use warnings; $/ = ""; # Tallies 4-grams in each line Parens are ignored # Default input from STDIN Default output to STDOUT. my %count; while (<>) { # remove parens and tokenize s/\(/ /g; s/\)/ /g; = split; # count 4-grams foreach my $i (0.. $#token - 3) { # Comment ça marche, ça??? } # output while (my ($key, $value) = each %count) { print "$value $key\n"; }

25 25 Exemple – unique #!/usr/bin/perl –w use strict; use warnings; # Eliminates all but the first occurrence of each line in a file # without otherwise changing the order. my %seen; while (<>) { if ($seen{$_}) { next; } else { $seen{$_}++; print; }

26 26 Passage de paramètres au programme En Unix/Linux/Cygwin on peut appeler un programme Perl en lui donnant des paramètres, comme on le fait pour les commandes Unix. Les paramètres sont stockés dans un tableau spécial Le premier paramètre est donc $ARGV[0] $#ARGV est l'indice du dernier élément du donc $ARGV[$#ARGV] est la valeur du dernier élément du tableau Exemple open(P, $ARGV[0]) || die "Couldn't open $ARGV[0]: $!";

27 27 Paramètres : options avancées Le module Perl Getopt::Long nous permet de spécifier facilement une série de paramètres aussi complexe quon le veut. Voire « perldoc Getopt::Long » ou /Long.html pour la documentation complète. Exemple : sub usage { print STDERR "Usage: $0 [-debug] [-count ] [-help] [-outfile ] \n"; exit 1; } my $debug = 0; my $outfile = ""; my $help; my $count = 0; GetOptions(debug => \$debug, help => \$help, "outfile=s" => \$outfile, "count=i" => \$count, ) or usage;# Exit avec message en cas derreur # Maintenant, $debug, $outfile, $help et $count contiennent # les valeurs que lusager a spécifiées pour les paramètres. $help and usage;# Exit avec message si lusager tape -h my $infile = shift;# shift fournit le paramètre suivant

28 28 Fonctions prédéfinies – chaînes de caractères chop(ch) Enlève le dernier caractère de la chaîne ch. $ch=cerises; chop($ch); => ch contient 'cerise while(<>){chop; …} => le retour de chariot est enlevé de $_ chomp(ch) Même chose que « chop » mais enlève uniquement un retour de chariot en fin de chaîne. length(ch) Retourne le nombre de caractères de la chaîne ch. length(cerise) => 6 uc(ch) Retourne la chaîne ch en majuscules. $ch = uc(poire) => 'POIRE' $ch = uc(PoIrE) => 'POIRE' lc(ch) Retourne la chaîne ch en minuscules. $ch = lc(POIRE) => 'poire'

29 29 Fonctions prédéfinies – chaînes de caractères substr(ch, début, longueur) Retourne la chaîne de caractère contenue dans ch, commençant au caractère à lindice début et de longueur longueur. $ch=substr(dupond, 0, 3) => 'dup' $ch=substr(Les fruits, 4) => 'fruits' index(ch, sousch, début) Retourne la position de la première instance de sousch dans ch. Si début est spécifié, il spécifie la position de départ pour la recherche. $i=index(Le temps des cerises, cerise); => 13

30 30 Fonctions prédéfinies – tableaux, listes = (amande, fraise, cerise); pop (tableau) Enlève et retourne le dernier élément de tableau. print => affiche devient ('amande','fraise') push (tableau, élément) Ajoute élément à la fin de tableau (contraire de pop). abricot); devient ('amande','fraise','abricot') shift(tableau) Enlève et retourne le premier élément de tableau. print => Affiche devient ('fraise','abricot') unshift (tableau, élément) Ajoute élément au début de tableau. poire); devient ('poire','fraise','abricot')

31 31 Fonctions prédéfinies – tableaux, listes sort (tableau) Trie le tableau (en ordre ASCII croissant par = sort devient ('abricot', 'fraise, = sort {$b cmp # Tri inverse devient (poire, 'fraise, 'abricot') sort (10, 3, 5) => (10, 3, 5)# Tri ASCII sort {$a $b} (10, 3, 5) => (3, 5, 10)# Tri numérique sort {$b $a} (10, 3, 5) => (10, 5, 3)# Tri numérique inverse sort {$a cmp $b} (e, C, a) => (C, a, e) # Tri ASCII sort (e, C, a) => (C, a, e) # Tri ASCII sort {lc($a) cmp lc($b)} (e, C, a) => (a, C, e) reverse (tableau) Inverse le = redevient ('abricot', 'fraise, poire)

32 32 Fonctions prédéfinies – tableaux, listes splice (tableau, début, nb, liste) Remplace nb éléments de tableau à partir de l'indice début avec les éléments dans liste. Retourne un tableau contenant les éléments enlevés. = ('poire', 'fraise', 'abricot', 'cerise') = ('carotte', 'tomate', = 1, = ('poire', 'carotte', 'tomate', 'céleri', = ('fraise', 'abricot')

33 33 Fonctions prédéfinies – tableaux, listes splice (tableau, début, nb, liste) Dans les cas limites, on peut utiliser splice au lieu de shift, pop, unshift et push. $a = = $z = = unshift substr (ch, début, longueur, remplacement) Si on spécifie un remplacement, comme avec splice, la sous chaîne est remplacée par remplacement. my $ch = "abcdef"; substr($ch, 2, 3, "12345"); => $ch = ab12345f substr($ch, 2, 3) = "12345"; # Code équivalent

34 34 #!/usr/bin/perl –w use strict; use warnings; # blanks out given words # the words to remove should be in a file, one per line # check for correct usage if ($#ARGV < 0) { # pas de params print STDERR "usage: blankwords [ ]\n"; exit 1; } open(P, $ARGV[0]) or die "Couldn't open killword file $ARGV[0]: $!"; my $killwords = "\n"; while ( ) { $killwords.= $_; # $var OP= $val equivaut à $var = $var OP $val } close(P); shift; # s'applique Exemple – blankwords

35 35 Exemple – blankwords while (<>) { = split;# split on whitespace = split("", $_);# split on nullspace to get char array my $offset = 0; for ( my $i = 0; $i $i++ ) { $offset = index($_, $token[$i], $offset); my $size = length($token[$i]); my $pat = "\Q$token[$i]\E"; # \Q quotes meta chars until \E if ($killwords =~ /\n$pat\n/) { foreach my $ind ($offset.. $offset + $size - 1) { $ind, 1, " "); # avec splice } # avec substr: substr($_, $offset, $size, " " x $size); } $offset += $size; } # avec splice # avec substr: print $_; }

36 36 Exemple – blankclasses #!/usr/bin/perl –w use strict; use warnings; # Blanks out words of a given POS in a tagged text the POS to remove # should be in a file, one per line. Words and tags are separated by :: # check for correct usage if ($#ARGV < 0) { print STDERR "usage: blankclasses [ ]\n"; exit 1; } open(P, $ARGV[0]) or die "Couldn't open POS-list file $ARGV[0]: $!"; my $killclasses = "\n"; while ( ) { $killclasses.= $_; } close(P); shift;

37 37 while (<>) { s/^ *//; # enlever les espace au début de ligne = split;# split on whitespace for (my $i = 0; $i $i++) { scalar context if ($token[$i] =~ /(.+)::(.+)/) { # word::tag and back-ref my $word = $1; my $tag = $2; if ($killclasses =~ /\n$tag\n/) { $token[$i] = " " x length($token[$i]); } } else { die "Word or Tag missing from token $token[$i]\n"; } print join(' "\n"; } Exemple – blankclasses


Télécharger ppt "1 Perl : Notions avancées Expressions rationnelles/régulières Utilisation en Perl Tableaux associatifs Fonctions prédéfinies."

Présentations similaires


Annonces Google