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
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.
#!/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:

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
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.
($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
0
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
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.
0
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
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
    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 ;-)
0
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
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 :

#!/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.
0

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
Re,

#!/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
0
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
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.
0
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
Re,

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" ;
}
0
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
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é.
0
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
Re,

Je vais regarder ce soir quand j'arrive à la maison ;-)
0
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
Merci ^^
0
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
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)
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

0
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
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.
0
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
Re,
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$
0
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
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 ?
0
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
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.

0