Rechercher : dans
Par :

[PERL]pb avec la fonction grep

Dernière réponse le 19 nov 2006 à 21:12:44 Johann, le 18 nov 2006 à 21:03:14 
 Signaler ce message aux modérateurs

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 !!

Meilleures réponses pour « [PERL]pb avec la fonction grep » dans :
Perl - Les fonctions Voir La notion de fonction et de procédure On appelle procédure un sous-programme qui permet d'effectuer un ensemble d'instruction par simple appel de la procédure dans le corps du programme principal. Les procédure permettent d'exécuter dans plusieurs...
Perl - Les fichiers Voir La notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
[PHP] Fonction mail() VoirLa fonction mail() est bloquée chez certains des hébergeurs gratuits pour des raisons de sécurité (afin d'éviter le spam notamment), l'adresse ip de la machine qui a demandé le script sera alors indiquée dans le header 'X-MM-Mail-From-IP'. renseignez...
Faire fonctionner une application Windows sous Linux avec Wine VoirWine est un logiciel permettant de faire fonctionner certaines applications Windows sous Linux. Contrairement à VMWare ou VirtualBox, Wine n'émule pas un PC complet, mais seulement les API Win32 (appels système Windows). L'émulation n'est pas...
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Perl - Entrée et sortie standards VoirQu'appelle-t-on entrée standard et sortie standard ? Perl permet d'écrire sur la sortie standard, appelée STDOUT et de lire sur l'entrée standard (STDIN). Il s'agit de deux descripteurs fournis par le système d'exploitation et permettant...
Javascript - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Cette notion de sous-programme est généralement appelée fonction...
PHP - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...

1

lami20j, le 18 nov 2006 à 23:48:49

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

Répondre à lami20j

2

Johann, le 19 nov 2006 à 16:10:23

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...

Répondre à Johann

3

lami20j, le 19 nov 2006 à 16:16:03

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

Répondre à lami20j

4

Johann, le 19 nov 2006 à 18:08:17

Voilà le lien de mon fichier

http://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.

Répondre à Johann

5

lami20j, le 19 nov 2006 à 18:15:00

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

Répondre à lami20j

6

lami20j, le 19 nov 2006 à 18:28:01

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

Répondre à lami20j

7

lami20j, le 19 nov 2006 à 18:37:15

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

Répondre à lami20j

8

Johann, le 19 nov 2006 à 19:39:03

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.

Répondre à Johann

9

lami20j, le 19 nov 2006 à 20:02:54

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

Répondre à lami20j

10

lami20j, le 19 nov 2006 à 20:27:04

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

Répondre à lami20j

11

 Johann, le 19 nov 2006 à 21:12:44

Le bourrin... ;)

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

Je t'en remercie très fortement !!

Bonne semaine !!

Répondre à Johann