PERL : aide sur une variable d'expression reg
Lazarey
Messages postés
3239
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour à tous,
J'ai un petit soucis avec un exo de perl.
Voici l'énoncé :
Complétez le programme ci-dessous pour qu'il affiche le premier mot du nombre de lettre saisi. Utilisez \b pour délimiter le mot.
Il fallait remplir la condition après le if, je pense que ça c'est bon.
Mais là où je bloque, c'est dans le dernier print. Je ne vois absolument pas quoi mettre. J'ai essayé $_ mais ça marche pas, j'ai aussi mis $phrase, mais ça affiche tout (normal), puis j'ai mis tout un tas de truc improbables qui n'ont pas marché.
Je ne vois pas aussi où doit intervenir le \b.
Quelqu'un pourrait-il m'aider pour que je puisse continuer ma liste d'exercices ???
Merci beaucoup.
J'ai un petit soucis avec un exo de perl.
Voici l'énoncé :
Complétez le programme ci-dessous pour qu'il affiche le premier mot du nombre de lettre saisi. Utilisez \b pour délimiter le mot.
#!/usr/local/bin/perl -w print ("Saisissez une phrase : ") ; $phrase = <STDIN> ; chomp($phrase) ; print ("Saisissez un nombre : ") ; chomp($nombre = <STDIN>) ; if ($phrase =~ /.{$nombre}/) { print ("Le mot de $nombre lettres a ete trouve : $... \n") ; }
Il fallait remplir la condition après le if, je pense que ça c'est bon.
Mais là où je bloque, c'est dans le dernier print. Je ne vois absolument pas quoi mettre. J'ai essayé $_ mais ça marche pas, j'ai aussi mis $phrase, mais ça affiche tout (normal), puis j'ai mis tout un tas de truc improbables qui n'ont pas marché.
Je ne vois pas aussi où doit intervenir le \b.
Quelqu'un pourrait-il m'aider pour que je puisse continuer ma liste d'exercices ???
Merci beaucoup.
A voir également:
- PERL : aide sur une variable d'expression reg
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- DzSoft Perl Editor - Télécharger - Édition & Programmation
- Comment lire un fichier .pl perl ? - Forum Windows
- Perl: transformer un fichier en package ✓ - Forum Perl
15 réponses
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
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.
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 ;-)
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
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
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.
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" ; }
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é.
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
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.
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$
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 ?
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.