[PERL]pb avec la fonction grep

Résolu
Johann -  
 Johann -
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

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. Johann
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. Johann
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  9. Johann
     
    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
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  12. Johann
     
    Le bourrin... ;)

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

    Je t'en remercie très fortement !!

    Bonne semaine !!
    0