PERL : aide sur une variable d'expression reg
Fermé
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
-
24 févr. 2009 à 13:46
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 févr. 2009 à 06:27
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 févr. 2009 à 06:27
A voir également:
- PERL : aide sur une variable d'expression reg
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- Perl foreach ✓ - Forum Perl
- Perl substitution ✓ - Forum Perl
- /Usr/bin/env: ‘perl\r’: no such file or directory ✓ - Forum Linux / Unix
15 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 13:55
24 févr. 2009 à 13:55
Salut,
/.{$nombre}/
Le point reconnais aussi l'espace, donc tu n'est pas sur que tu as un mot.
\b c'est une assertion nulle qui permet de delimiter les mots, ainsi tu obligeras le . de reconnaître toujours un non espace.
106485010510997108
/.{$nombre}/
Le point reconnais aussi l'espace, donc tu n'est pas sur que tu as un mot.
\b c'est une assertion nulle qui permet de delimiter les mots, ainsi tu obligeras le . de reconnaître toujours un non espace.
($phrase =~ /\b.{$nombre}\b/)Ce qui donne (je n'ai pas testé
#!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; # pas besoin de paranthèses chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; if ($phrase =~ /\b(.{$nombre})\b/) { # les paranthèses capture le mot print "Le mot de $nombre lettres a ete trouve : $1 \n" ; }--
106485010510997108
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 14:08
24 févr. 2009 à 14:08
Super ça fonctionne.
Merci beaucoup !!!!!!!!
Pour les parenthèses après le print, je le sais, mais notre cher prof les a mises (va savoir pourquoi).
Ensuite, javais bien pensé aux parenthèses de mémorisation, mais je n'ai pas trouvé.
En tout cas merci beaucoup.
Je continue.
Merci beaucoup !!!!!!!!
Pour les parenthèses après le print, je le sais, mais notre cher prof les a mises (va savoir pourquoi).
Ensuite, javais bien pensé aux parenthèses de mémorisation, mais je n'ai pas trouvé.
En tout cas merci beaucoup.
Je continue.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 14:16
24 févr. 2009 à 14:16
Re,
je le sais, mais notre cher prof les a mises (va savoir pourquoi).
Puisque beaucoup des gens prennent Perl comme du C.
En fait print peut être utiliser comme une fonction ou comme une opérateur de liste (en ce cas la priorité est importante)
Si on l'utilise comme une fonction alors on utilise les paranthèses.
Voici quelque exemple pour voir la différence
Dans ton script print est juste une opérateur de liste donc pas besoin de paranthèses. Tu peux expliquer ça à ton prof ;-)
je le sais, mais notre cher prof les a mises (va savoir pourquoi).
Puisque beaucoup des gens prennent Perl comme du C.
En fait print peut être utiliser comme une fonction ou comme une opérateur de liste (en ce cas la priorité est importante)
Si on l'utilise comme une fonction alors on utilise les paranthèses.
Voici quelque exemple pour voir la différence
print 1+2+4; # affiche 7. print(1+2) + 4; # affiche 3. print (1+2)+4; # affiche aussi 3 ! print +(1+2)+4; # affiche 7. print ((1+2)+4); # affiche 7.
Dans ton script print est juste une opérateur de liste donc pas besoin de paranthèses. Tu peux expliquer ça à ton prof ;-)
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 14:42
24 févr. 2009 à 14:42
Je ne vais pas s'aventurer à expliquer des choses à mon prof ^^
Mais merci pour l'explication.
Sinon, j'ai un autre soucis.
Je dois modifier ce programme pour qu'il affiche tous les mots contenant le nombre de lettres saisi.
J'ai ça, mais ça ne fonctionne pas :
Cela fonctionne bien pour le premier mot, mais ensuite après le substitute, le motif retourné contient des espaces et j'ai donc des mots contenant mois de caracteres que ceux voulus.
Ce que je veux faire c'est que une fois le mot lu, je le supprime de ma $phrase, puis je relance la recherche avec le while.
Je pense que ma démarche est correcte, mais je n'arrive pas à la programmer.
Mais merci pour l'explication.
Sinon, j'ai un autre soucis.
Je dois modifier ce programme pour qu'il affiche tous les mots contenant le nombre de lettres saisi.
J'ai ça, mais ça ne fonctionne pas :
#!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; while ($phrase =~ /\b(.{$nombre})\b/) { print "Le mot de $nombre lettres a ete trouve : $1 \n" ; $phrase =~ s/\b.{$nombre}\b//; print "\n$phrase\n"; }
Cela fonctionne bien pour le premier mot, mais ensuite après le substitute, le motif retourné contient des espaces et j'ai donc des mots contenant mois de caracteres que ceux voulus.
Ce que je veux faire c'est que une fois le mot lu, je le supprime de ma $phrase, puis je relance la recherche avec le while.
Je pense que ma démarche est correcte, mais je n'arrive pas à la programmer.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 14:48
24 févr. 2009 à 14:48
Re,
106485010510997108
#!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; # pas besoin de paranthèses chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; my @mots=$phrase =~ /\b(.{$nombre})\b/g; print @mots+0, " mot(s) trouvé(s)\n"; print "Voici la liste des mots de $nombre lettres \n"; print "$_\n" foreach (@mots);--
106485010510997108
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 15:56
24 févr. 2009 à 15:56
Coucou et merci, mais ça ne fonctionne toujours pas. Ca affiche bien 6 caracteres, mais parfois ça met des mots contenant des espaces.
Le problème est le même.
Sais tu d'où vient le probleme ???
Merci.
Le problème est le même.
Sais tu d'où vient le probleme ???
Merci.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 16:20
24 févr. 2009 à 16:20
Re,
Je n'ai pas des moyes pour tester
Essaie
Je n'ai pas des moyes pour tester
Essaie
#!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; # pas besoin de paranthèses chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; while ($phrase =~ /\b(.{$nombre})\b/gc) { print "Le mot de $nombre lettres a ete trouve : $1 \n" ; }
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 16:26
24 févr. 2009 à 16:26
Toujours le même soucis.
Mais ce n'est pas grave, je vais passer à la suite des exos.
Ne te casse pas la tete pour si peu.
Merci beaucoup de m'avoir aidé.
Mais ce n'est pas grave, je vais passer à la suite des exos.
Ne te casse pas la tete pour si peu.
Merci beaucoup de m'avoir aidé.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 16:31
24 févr. 2009 à 16:31
Re,
Je vais regarder ce soir quand j'arrive à la maison ;-)
Je vais regarder ce soir quand j'arrive à la maison ;-)
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 16:43
24 févr. 2009 à 16:43
Merci ^^
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 18:36
24 févr. 2009 à 18:36
Re,
Ben voici mes tests (je n'ai rien changé au code) et ça marche chez moi (à moins que je n'ai pas compris ce que tu veux)
Ben voici mes tests (je n'ai rien changé au code) et ça marche chez moi (à moins que je n'ai pas compris ce que tu veux)
lami20j@debian:~/trash/ccm_perl$ cat ccm12_compter_mots.pl #!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; # pas besoin de paranthèses chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; my @mots=$phrase =~ /\b(.{$nombre})\b/g; print @mots+0, " mot(s) trouvé(s)\n"; print "Voici la liste des mots de $nombre lettres \n"; print "$_\n" foreach (@mots); __END__ lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_mots.pl Saisissez une phrase : Je vais compter le nombre de mots avec deux lettres Saisissez un nombre : 2 3 mot(s) trouvé(s) Voici la liste des mots de 2 lettres Je le de lami20j@debian:~/trash/ccm_perl$ cat ccm12_compter_motsv2.pl #!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; # pas besoin de paranthèses chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; while ($phrase =~ /\b(.{$nombre})\b/gc) { print "Le mot de $nombre lettres a ete trouve : $1 \n" ; } __END__ lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_motsv2.pl Saisissez une phrase : Je vais compter le nombre de mots avec deux lettres Saisissez un nombre : 2 Le mot de 2 lettres a ete trouve : Je Le mot de 2 lettres a ete trouve : le Le mot de 2 lettres a ete trouve : de
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 20:05
24 févr. 2009 à 20:05
Chez moi ça fonctionne pas, même avec des mots de 2 lettres. Mais avec ta phrase, ça fonctionne.
Voila ce qui est affiché :
https://www.casimages.com/i/090224080918361354.jpg.html
Mais ne t'embetes pas car j'ai fait d'autres exercices et c'est bon.
C'est déja gentil de m'avoir aidé.
Mais si tu veux chercher par contre, vas y, je serais quand même content d'avoir la réponse.
Voila ce qui est affiché :
https://www.casimages.com/i/090224080918361354.jpg.html
Mais ne t'embetes pas car j'ai fait d'autres exercices et c'est bon.
C'est déja gentil de m'avoir aidé.
Mais si tu veux chercher par contre, vas y, je serais quand même content d'avoir la réponse.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 févr. 2009 à 20:15
24 févr. 2009 à 20:15
Re,
1er script (modification en gras - à faire pareil pour le deuxième script)
1er script (modification en gras - à faire pareil pour le deuxième script)
lami20j@debian:~/trash/ccm_perl$ cat ccm12_compter_mots.pl #!/usr/local/bin/perl use strict;use warnings; print "Saisissez une phrase : "; # pas besoin de paranthèses chomp(my $phrase = <STDIN>) ; print ("Saisissez un nombre : ") ; chomp(my $nombre = <STDIN>) ; my @mots=$phrase =~ /\b([^\s]{$nombre})\b/g; print @mots+0, " mot(s) trouvé(s)\n"; print "Voici la liste des mots de $nombre lettres \n"; print "$_\n" foreach (@mots); __END__ lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_mots.pl Saisissez une phrase : alors si on compte les mots plus longues cest pire Saisissez un nombre : 2 2 mot(s) trouvé(s) Voici la liste des mots de 2 lettres si on lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_mots.pl Saisissez une phrase : alors si on compte les mots plus longues cest pire Saisissez un nombre : 3 1 mot(s) trouvé(s) Voici la liste des mots de 3 lettres les lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_mots.pl Saisissez une phrase : alors si on compte les mots plus longues cest pire Saisissez un nombre : 4 4 mot(s) trouvé(s) Voici la liste des mots de 4 lettres mots plus cest pire lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_mots.pl Saisissez une phrase : alors si on compte les mots plus longues cest pire Saisissez un nombre : 5 1 mot(s) trouvé(s) Voici la liste des mots de 5 lettres alors lami20j@debian:~/trash/ccm_perl$ perl ccm12_compter_mots.pl Saisissez une phrase : alors si on compte les mots plus longues cest pire Saisissez un nombre : 10 0 mot(s) trouvé(s) Voici la liste des mots de 10 lettres lami20j@debian:~/trash/ccm_perl$
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
24 févr. 2009 à 21:08
24 févr. 2009 à 21:08
Ok d'ac.
\s pour que ça ne soit pas un espace.
Mais alors pourquoi on a mis \b ???? C'est bien pour séparer les mots non ?
\s pour que ça ne soit pas un espace.
Mais alors pourquoi on a mis \b ???? C'est bien pour séparer les mots non ?
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
25 févr. 2009 à 06:27
25 févr. 2009 à 06:27
Salut,
\b.{$nombre}\b
On cherche une limite de mot (\b) suivi de n'importe quel caractère (qui peut être aussi un espace ou encore n'importe quel caractère qui n'est pas une lettre) - $nombre fois et suivi d'un autre caractère de fin de mot (\b)
C'est pour ça qu'on peut avoir des reconnaissances bizarres.
[^\s] permet de trouver tout caractère qui n'est pas un espace, tabulation
Pour aller plus loin tu peux mettre dans la classe de caractères aussi les caractères qui ne sont pas des lettres.
\b.{$nombre}\b
On cherche une limite de mot (\b) suivi de n'importe quel caractère (qui peut être aussi un espace ou encore n'importe quel caractère qui n'est pas une lettre) - $nombre fois et suivi d'un autre caractère de fin de mot (\b)
C'est pour ça qu'on peut avoir des reconnaissances bizarres.
[^\s] permet de trouver tout caractère qui n'est pas un espace, tabulation
Pour aller plus loin tu peux mettre dans la classe de caractères aussi les caractères qui ne sont pas des lettres.