Script Perl

Fermé
bansan Messages postés 122 Date d'inscription samedi 7 février 2004 Statut Membre Dernière intervention 8 mai 2011 - 25 mars 2008 à 08:46
b0rice Messages postés 9 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 1 avril 2008 - 25 mars 2008 à 09:55
Bonjour,
Voici une demande de script dont je ne vois pas pourquoi elle ne marche pas quand je l'ecris en ligne de code


Nombre d'occurrences
Ecrire un script Perl dont le role de compter et d'afficher le nombre d'occurrences d'un caractere dans une chaine. Le caractere ainsi que la chaine sont saisis par I'utilisateur.

Exemple d'exécution (en gras, ce qui est saisi par rutilisateur) :
Saisir une chaine : une graine de baobab
Saisir un caractere : a
Le caractere a apparait 3 fois dans la chaine.

Voila mes commandes:

#!/usr/local/bin/perl
#nombre d'occurences d'une chaine
print "Saisir une chaine:";
$f=<STDIN>;
print "Saisir un caractere:";
$g=<STDIN>;
$l=length($f);
$p=0 ;
for ($i=0;$i<$l;$i++) {
$e=substr($f,$i,1);
if ($g==$e) {
$p=$p+1;
}
}
print "Le caractere $g apparait $p fois "
Ou y a t'il une erreur.?
MErci de me repondre
A voir également:

1 réponse

b0rice Messages postés 9 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 1 avril 2008 1
25 mars 2008 à 09:19
Hello,

Plusieurs choses:

1. En général, le path de perl est /usr/bin/perl mais, peut-être que chez toi c'est bien /usr/local/bin/perl.
2. Quand tu fais un truc du genre $g = <STDIN>, le caractère de fin de ligne ("\n" en général sous linux/unix) fait partie de la saisie. La commande pour le virer simplement est chomp $g
3. En perl, l'opérateur de comparaison == teste l'égalité numérique. Ce que tu veux c'est l'opérateur eq qui teste l'égalité entre des chaînes.

#!/usr/bin/perl
#nombre d'occurences d'une chaine
print "Saisir une chaine: ";
$f=<STDIN>;
print "Saisir un caractere: ";
$g=<STDIN>;
chomp $g;
$l=length($f);
$p=0 ;
for ($i=0;$i<$l;$i++) {
$e=substr($f,$i,1);
if ($g eq $e) {
$p=$p+1;
}
}
print "Le caractere $g apparait $p fois\n" ;

Voilà, ça fonctionne.
0
bansan Messages postés 122 Date d'inscription samedi 7 février 2004 Statut Membre Dernière intervention 8 mai 2011 1
25 mars 2008 à 09:36
Bonjour
Ahlalala, j'avais donc presque tout bon...si j'en crois ton script, j'avais une erreur dans l'egalité qui n'espas == mais eq...et la ofonction chomp pour supprimer le dernier caractere sans quoi ca prenait le dernier caractere en compte dans le comptage
...Je vois je vois..
J'ai cherche jusqu'a minuit hier soir ou ca ne collait pas...
Merci beaucoup.

Je suis en train de plancher sur celui ci maintenant pendant que j'attendais une solution pour la premiere
Je suppose que c'est la meme erreurs ou les memes erreurs que j'etais en train de faire pour celle la:

Nombre de voyelles
Ecrire un script Perl dont le role est de compter et d'afficher le nombre de voyelles (accentuees ou
non) presentes dans une chaine de caracteres saisie par I'utilisateur.

Voici ce que j'etais en train de faire

#!/usr/local/bin/perl
#nombre de voyelles
print"Saisir une phrase:";
$p=<STDIN>;
@voyelle=("a","e","i","o","u","é","à","è") ;
$l=length($p);
$t=0;
for ($u=0;$u<=$#voyele;$u++){

for ($i=0;$i<$l-1;$i++) {
$d=substr($p,$i,1);
if ($voyelle[$u]==$d){
$t=$t+1 ;

}
}
print "$t"
0
b0rice Messages postés 9 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 1 avril 2008 1 > bansan Messages postés 122 Date d'inscription samedi 7 février 2004 Statut Membre Dernière intervention 8 mai 2011
25 mars 2008 à 09:55
Re.

Pour le dernier caractère viré par chomp, le problème n'était pas dans le comptage mais dans le test d'égalité. En fait sans le chomp, ça revenait à tester chaque caractère eq "a\n" ce qui, évidemment, n'était jamais vrai.

Pour ton 2ème problème, le mieux ce serait de passer par des expressions régulières pour les voyelles.

En fait les re sont extrêmement utilisées en Perl (c'est une de ses grandes forces).

Elles auraient déjà pu être utilisées dans ton 1er problème.

par exemple si tu écris un truc du style:

my $chaine = "elle est où ma voyelle\n";
my @voyelles = $chaine =~m/^[aeiouàéèù]$/g;
print "longueur de la chaine: ".(length($chaîne)-1)."\n";
print "nb de voyelles: @voyelles\n";

Ca devrait le faire...

Explications:

[] dans une re est une liste de cas possibles. L'égalité est testée avec chaque membre. par ex [a-zA-Z] sera vrai pour toute lettre de l'alphabet occidental.
le commutateur /g permet de rechercher chaque occurence
^ est le début d'une chaîne (ce n'est pas un caractère à proprement parler)
$ est la terminaison d'une ligne (ici \n)
$chaine =~ m/$re/ permet de tester une re sur $chaine

Voilà. Désolé, pas le temps de tester le code, j'ai un avion à prendre ;)

Bon courage et bonne journée.

P.S.: Ton " dans la liste de voyelles est seulement valable si tu parses du code html.
0