[PERL]pb avec la fonction grep

Résolu/Fermé
Johann - 18 nov. 2006 à 21:03
 Johann - 19 nov. 2006 à 21:12
Bonsoir tout le monde !!

Voilà, le code ci-dessous me parait fortement cohérent, et pourtant d'après les résultats obtenus je m'aperçois qu'il n'en est guère le cas :


while($line = <IN>){ 
		chomp($line);
		for ($k=0;$k<length($line);$k++){
					 
			if (!grep(lc(substr($line,$k,1)), @tablo)){
			push(@tablo, lc(substr($line,$k,1)));
			}
		}
	}



Ce code lit ligne par ligne un fichier, puis pour chaque caractère de la ligne insère dans un tableau si il n'y est pas présent, du moins c'est ce qu'il devrait faire, mais quand j'affiche le tableau finale il n'y a que le premier caractère...

Y'a t'il à debugger dans l'ame par ici ?

Merci d'avance et très bon week end !!

11 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 565
18 nov. 2006 à 23:48
Salut,

essaie ça (je sauvegarde dans le tableau tous les consonnes du fichier lettres)
#!/usr/bin/perl
use warnings;use strict;

my @res;

open F_LIRE,"lettres"
   or die "E/S: $!\n";

while( my $l=<F_LIRE> ){
 chomp($l);
 for my $z(split //,$l){
	 push @res,$z unless grep { /$z/ } qw/a e i o u/;
 }
}
print "@res\n";
lami20j

P.S. A adapter à ton cas
0
Salut Lami20j et merci pour ta réponse !!

J'ai testé le code que tu m'as fourni mais hélas il ne marche point, j'ai le message d'erreur :

Quantifier follows nothing in regex; marked by <-- HERE in m/? <-- HERE / at ./1 line 13, <F_LIRE> line 2.


J'ai un peu tester encore cette aprem de foutre dans ce foutu tableau les lettres uniques contenus dans le fichier mais en vain...
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 565
19 nov. 2006 à 16:16
Affiche ton code complet pour voir, chez moi il n'y a pas de regex.
Et donne aussi ton fichier (mets le sur cjoint.com)
Ce que je t'ai donné c'est une exemple, mais on va tourner en ronde si je ne sais pas ce que tu fait


lami20j
0
Voilà le lien de mon fichier

https://www.cjoint.com/?ltsfh4JqMF

J'ai copier/coller le code que tu m'as fourni pour tester ce que ça faisait, mais c'est là que j'ai eu le messages d'erreur cité.

Merci encore.
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 565
19 nov. 2006 à 18:15
J'ai besoin du fichier toto (sur cjoint.com ), pas le script qu'il fallait le copier ici sur ccm.

vu ton code déjà il y a des problème

if avec sans instructions
tu travaille sur le même tableau @tablo

et à vrai dire je ne comprends pas ce que tu veux
si tu as besoin de tout les lettres d'un fichier alors c'est vraiment simple
je vois que tu initialise le @tableo avec "z"

je ne comprends pas!!!!!

lami20j
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 565
19 nov. 2006 à 18:28
Re,

sans vouloir t'ofenser je constate que ton niveau en Perl est du débutant mal renseigné

Quand je vois ce but du code
$k = 0;
foreach(@tablo){
  print $tablo[$k];
  $k++;
}
je peux te dire que tu n'as pas compris la boucle foreach

foreach(@tablo){
  print "$_\n";
}
ou
foreach my $element ( @tablo ){
  print "$element\n";
}
ou même
$"="\n";
print "@tablo";
font la même chose (affichage des éléments du tableau, un element par ligne

Pour chaque élément du tableau, affiche l'élément


lami20j
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 565
19 nov. 2006 à 18:37
Re,

pour l'info

je teste ton code sur un fichier quelconque et j'obtiens le résultat z (c'est normal vu ton code )

en revanche je teste le mien et j'obtiens toutes les consonnes


pas de messages d'erreur regex

donc donne moi ton fichier toto, ensuite explique exactement ce que tu veux obtenir et je t'enverrai le script

pas besoin d'essayer de debugger ton code puisqu'il est très mal conçu, mieux vaut apprendre des bonnes habitudes et de lire la documentation.

comme toujours, ne prends pas mal ce que je te dit, on est tous débutans un jour, mais surtout quand on est débutant il faut lire, se renseigner, ce qui ne veut pas dire qu'après il faut arrêter de lire :-))

lami20j
0
Re

T'inquiète je le prends pas mal :) j'ai commencé le perl depuis mercredi sans vraiment de cours de la part du prof, j'ai donc télécharger une doc avec les différentes commande.

Le fichier toto c'est juste un simple fichier comprenant une phrase quelconque.

Mon script dois dire combien le fichier toto compte de 'a', de 'b', de 'c' ... . Pour cela, l'idée de mon IF était de dire, si tu ne trouves pas la lettre examiné dans le tableau, ALORS tu l'insères en fin de tableau. Au finale je me retrouve avec un tableau contenant les lettres uniques de ce fichier, après il faut déterminer le nombre de fois que la lettre à été trouvé.

PS : c'était juste un test l'initialisation de 'z' dans le première cellule du tableau. Je pensais que je l'avais virer avant de te filer le code.
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 565
19 nov. 2006 à 20:02
Mon script dois dire combien le fichier toto compte de 'a', de 'b', de 'c' ... .

ok, maintenant j'ai compris ce que tu veux
voici le script( et c'est bien plus simple maintenant que je sais ce que tu veux :-))
#!/usr/bin/perl
use warnings;use strict;

my %nb_lettres;

open F_LIRE,"fichier.txt"
   or die "E/S: $!\n";

while( my $l=<F_LIRE> ){
 foreach (split //,$l){
   $nb_lettres{$_}++ if /[a-z]/i;
 }
}

foreach (sort keys %nb_lettres){
  printf"Il y a %5s de %s\n",$nb_lettres{$_},$_;
}
__END__
lami20j
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 565
19 nov. 2006 à 20:27
Voilà encore une solution, c'est encore plus perlien ;-)
#!/usr/bin/perl
use warnings;use strict;

my %nb_lettres;

grep { $nb_lettres{$_}++ if /[a-z]/i } split //,`cat fichier.txt`;

foreach (sort keys %nb_lettres){
  printf"Il y a %5s de %s\n",$nb_lettres{$_},$_;
}
__END__
lami20j
0
Le bourrin... ;)

Bah en tout cas les deux solutions marchent très bien !!

Je t'en remercie très fortement !!

Bonne semaine !!
0