Re: [HS] script perl avec redondances
Le Wed, 11 Oct 2006 15:12:52 +0200 Nicolas Roudninski a écrit : > Bonjour à tous, > > Je sais que je suis hors sujet mais j'ai un petit problème avec un > script perl. > Ce script est chargé de vérifier si j'ai des messages de mes amis. > tout fonctionne bien, sauf que, à la première vérification, le script > m'affiche une fois que j'ai un message (quand j'en ai un). A la > deuxième vérification, le script me dit *deux* fois que j'ai un > message (et je n'ai qu'un message !). A la troisième vérif : *trois* > fois la même chose, etc. > > Il y a donc quelque chose de mal écrit, mais je n'arrive pas à trouver > quoi... > > Si quelqu'un peut m'aider à y voir plus clair, ce serait super ! Un grand merci à tous pour les réponses (nombreuses et rapides) Je pense avoir solutionné le problème en mettant mes variables globales à l'intérieur des fonctions, elles sont donc maintenant locales. Ça m'apprendra à trop mettre de variables globales ! Merci encore, cette liste est un vrai plaisir. PS : je ne pense pas que les messages en double viennent de chez moi. J'en reçois, moi aussi parfois en double... A moins que... J'ai envoyé le même message en cc à la liste ubuntu... -- Nicolas Roudninski [EMAIL PROTECTED] -- Toute ressemblance avec des fautes d'orthographe, de grammaire ou de conjugaison existantes ou ayant existé serait entièrement fortuite et indépendante de la volonté de l'auteur.
Re: [HS] script perl avec redondances
Nicolas Roudninski a écrit : sub read_data { open DATAFILE, "$home_dir/amis.dat" or die "Fichier introuvable !"; while () { chomp; push @amis, $_."\n"; c'est ici : @amis n'est pas vide la seconde fois et à la nième tu as n fois la liste de tes amis dans @amis } -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:" To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: [HS] script perl avec redondances
Le Wed, 11 Oct 2006 18:25:28 +0200 Vanuxem Grégory a écrit : > Le mercredi 11 octobre 2006 à 16:23 +0200, Nicolas Roudninski a > écrit : > > Le Wed, 11 Oct 2006 15:36:14 +0200 > > Vanuxem Grégory a écrit : > > > > > Le mercredi 11 octobre 2006 à 15:12 +0200, Nicolas Roudninski a > > > écrit : > > > > Bonjour à tous, > > > > > > > > Je sais que je suis hors sujet mais j'ai un petit problème avec > > > > un script perl. > > > > Ce script est chargé de vérifier si j'ai des messages de mes > > > > amis. tout fonctionne bien, sauf que, à la première > > > > vérification, le script m'affiche une fois que j'ai un message > > > > (quand j'en ai un). A la deuxième vérification, le script me > > > > dit *deux* fois que j'ai un message (et je n'ai qu'un > > > > message !). A la troisième vérif : *trois* fois la même chose, > > > > etc. > > > > > > > > Il y a donc quelque chose de mal écrit, mais je n'arrive pas à > > > > trouver quoi... > > > > > > > > Si quelqu'un peut m'aider à y voir plus clair, ce serait super ! > > > > > > [...] > > > > > > > #--- > > > > # Variables globales > > > > # > > > > my $xdlg = "/usr/bin/zenity"; > > > > my $pop; > > > > my $i; > > > > my $nom; > > > > my @amis; > > > > > > [...] > > > > > > > > > > > sub read_data { > > > > open DATAFILE, "$home_dir/amis.dat" > > > > or die "Fichier introuvable !"; > > > > while () { > > > > chomp; > > > > push @amis, $_."\n"; > > > > } > > > > > > [...] > > > > > > > while (1) { > > > > connection; > > > > read_data; > > > > > > [...] > > > > > > C'est normal que tu _rajoutes_ tes amis dans le tableau @amis à > > > chaque itération ? A la fin tu dois en avoir des amis :-) > > Ben non, c'est pas normal ! Et effectivement, à la fin j'en ai des > > amis, mais ce sont toujours les mêmes en plusieurs exemplaires... > > Oui et c'est de là que provient ton erreur, je voulais juste te donner > une piste afin que tu corriges cette erreur. Je n'ai plus ton code > mais si je me souviens bien tu itères sur les éléments de ton tableau > (tes amis) pour voir si tu as reçu un mail d'eux. Puisque qu'ils sont > en plusieurs exemplaires tu affiches plusieurs fois quelque chose > comme "j'ai reçu un mail de x". C'est exactement cela, il faut donc que je change tout ça. > > > Est-ce qu'en simplement fermant DATAFILE à la fin de read_data àa > > règlerait le problème ? > > Du tout non, tu le fais d'ailleurs si je me souviens bien. Ça n'a > rien à voir avec DATAFILE, le problème est que tu rajoutes des > éléments à ton tableau @amis à chaque appel de la fonction read_data > et comme ton tabeau est déclaré en début de script, hors de toutes > fonctions, il n'est jamais reinitialisé. Il y a plusieurs manières > de le corriger (TIMTOWTDI, Cf. Google) tu peux par exemple effacer le > contenu de @amis (en lui affectant un tableau vide) avant de pusher > tes amis (laid), déclarer et définir une seule fois ce tableau donc à > l'extérieur de ta fonction read_data mais les modifications du > fichier amis.dat après le démarrage de ton script ne seront pas pris > en compte, passer ce tableau (variable déclaré et définie dans > read_data donc non « globale » (je met entre guillemets car tes > variables sont en fait lexicales)) en paramètre à > jesaispluslafunction et bien d'autres (je te conseille de te > renseigner sur les déclarations et leur portées (scope)). > > Après c'est ta manière de coder, tu sembles apprendre donc je préfère > te laisser le faire. Je me suis aperçut juste après avoir posté ce message que je fermais bien DATAFILE ! J'avais pensé effectivement à effacer le contenu du tableau, mais je ne trouvais pas cela très élégant. tu confirme donc. Un grand merci. J'apprécie tant ta manière de présenter les choses que tes réponses. En effet, j'apprends perl et ça me plait énormément. Je ne serait jamais un as de la programmation (ce n'est pas ce que je recherche mais plutôt une curiosité) mais si je peux me perfectioné ce serait pas mal. Pour ce qui est de ma manière de coder, elle n'est sans doute pas terrible. J'accepte avec grand plaisir les conseils, critiques et suggestions ;-) > > > > > > > Juste une remarque, évite d'avoir autant de variables globales; > > > pourquoi ne pas passer des paramètres aux fonctions ? > > Oui, tu as raison. Je fais ça parce que au début, je testait plus > > qu'autre chose... > > Juste une question : pourquoi le fait d'avoir tant de variables > > globales pose problème ? > > Tu viens d'en rencontrer un. C'est crade, difficile à maintenir et ça > sera encore pire si tu veux ajouter des fonctionnalités (le principal > problème étant les conflits avec d'autres variables du même nom). Tout à fait d'accord. J'en mettrai le moins possible. Faut que je relise mes bouquins ! cordialement, -- Nicolas Roudninski [EMAIL PROTECTED] -- Toute r
Re: [HS] script perl avec redondances
Le mercredi 11 octobre 2006 à 16:23 +0200, Nicolas Roudninski a écrit : > Le Wed, 11 Oct 2006 15:36:14 +0200 > Vanuxem Grégory a écrit : > > > Le mercredi 11 octobre 2006 à 15:12 +0200, Nicolas Roudninski a > > écrit : > > > Bonjour à tous, > > > > > > Je sais que je suis hors sujet mais j'ai un petit problème avec un > > > script perl. > > > Ce script est chargé de vérifier si j'ai des messages de mes amis. > > > tout fonctionne bien, sauf que, à la première vérification, le > > > script m'affiche une fois que j'ai un message (quand j'en ai un). A > > > la deuxième vérification, le script me dit *deux* fois que j'ai un > > > message (et je n'ai qu'un message !). A la troisième vérif : > > > *trois* fois la même chose, etc. > > > > > > Il y a donc quelque chose de mal écrit, mais je n'arrive pas à > > > trouver quoi... > > > > > > Si quelqu'un peut m'aider à y voir plus clair, ce serait super ! > > > > [...] > > > > > #--- > > > # Variables globales > > > # > > > my $xdlg = "/usr/bin/zenity"; > > > my $pop; > > > my $i; > > > my $nom; > > > my @amis; > > > > [...] > > > > > > > > sub read_data { > > > open DATAFILE, "$home_dir/amis.dat" > > > or die "Fichier introuvable !"; > > > while () { > > > chomp; > > > push @amis, $_."\n"; > > > } > > > > [...] > > > > > while (1) { > > > connection; > > > read_data; > > > > [...] > > > > C'est normal que tu _rajoutes_ tes amis dans le tableau @amis à chaque > > itération ? A la fin tu dois en avoir des amis :-) > Ben non, c'est pas normal ! Et effectivement, à la fin j'en ai des > amis, mais ce sont toujours les mêmes en plusieurs exemplaires... Oui et c'est de là que provient ton erreur, je voulais juste te donner une piste afin que tu corriges cette erreur. Je n'ai plus ton code mais si je me souviens bien tu itères sur les éléments de ton tableau (tes amis) pour voir si tu as reçu un mail d'eux. Puisque qu'ils sont en plusieurs exemplaires tu affiches plusieurs fois quelque chose comme "j'ai reçu un mail de x". > Est-ce qu'en simplement fermant DATAFILE à la fin de read_data àa > règlerait le problème ? Du tout non, tu le fais d'ailleurs si je me souviens bien. Ça n'a rien à voir avec DATAFILE, le problème est que tu rajoutes des éléments à ton tableau @amis à chaque appel de la fonction read_data et comme ton tabeau est déclaré en début de script, hors de toutes fonctions, il n'est jamais reinitialisé. Il y a plusieurs manières de le corriger (TIMTOWTDI, Cf. Google) tu peux par exemple effacer le contenu de @amis (en lui affectant un tableau vide) avant de pusher tes amis (laid), déclarer et définir une seule fois ce tableau donc à l'extérieur de ta fonction read_data mais les modifications du fichier amis.dat après le démarrage de ton script ne seront pas pris en compte, passer ce tableau (variable déclaré et définie dans read_data donc non « globale » (je met entre guillemets car tes variables sont en fait lexicales)) en paramètre à jesaispluslafunction et bien d'autres (je te conseille de te renseigner sur les déclarations et leur portées (scope)). Après c'est ta manière de coder, tu sembles apprendre donc je préfère te laisser le faire. > > > > Juste une remarque, évite d'avoir autant de variables globales; > > pourquoi ne pas passer des paramètres aux fonctions ? > Oui, tu as raison. Je fais ça parce que au début, je testait plus > qu'autre chose... > Juste une question : pourquoi le fait d'avoir tant de variables > globales pose problème ? Tu viens d'en rencontrer un. C'est crade, difficile à maintenir et ça sera encore pire si tu veux ajouter des fonctionnalités (le principal problème étant les conflits avec d'autres variables du même nom). Greg -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:" To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: [HS] script perl avec redondances
Le Wed, 11 Oct 2006 15:36:14 +0200 Vanuxem Grégory a écrit : > Le mercredi 11 octobre 2006 à 15:12 +0200, Nicolas Roudninski a > écrit : > > Bonjour à tous, > > > > Je sais que je suis hors sujet mais j'ai un petit problème avec un > > script perl. > > Ce script est chargé de vérifier si j'ai des messages de mes amis. > > tout fonctionne bien, sauf que, à la première vérification, le > > script m'affiche une fois que j'ai un message (quand j'en ai un). A > > la deuxième vérification, le script me dit *deux* fois que j'ai un > > message (et je n'ai qu'un message !). A la troisième vérif : > > *trois* fois la même chose, etc. > > > > Il y a donc quelque chose de mal écrit, mais je n'arrive pas à > > trouver quoi... > > > > Si quelqu'un peut m'aider à y voir plus clair, ce serait super ! > > [...] > > > #--- > > # Variables globales > > # > > my $xdlg = "/usr/bin/zenity"; > > my $pop; > > my $i; > > my $nom; > > my @amis; > > [...] > > > > > sub read_data { > > open DATAFILE, "$home_dir/amis.dat" > > or die "Fichier introuvable !"; > > while () { > > chomp; > > push @amis, $_."\n"; > > } > > [...] > > > while (1) { > > connection; > > read_data; > > [...] > > C'est normal que tu _rajoutes_ tes amis dans le tableau @amis à chaque > itération ? A la fin tu dois en avoir des amis :-) Ben non, c'est pas normal ! Et effectivement, à la fin j'en ai des amis, mais ce sont toujours les mêmes en plusieurs exemplaires... Est-ce qu'en simplement fermant DATAFILE à la fin de read_data àa règlerait le problème ? > > > Juste une remarque, évite d'avoir autant de variables globales; > pourquoi ne pas passer des paramètres aux fonctions ? Oui, tu as raison. Je fais ça parce que au début, je testait plus qu'autre chose... Juste une question : pourquoi le fait d'avoir tant de variables globales pose problème ? > > Greg Cordialement, -- Nicolas Roudninski [EMAIL PROTECTED] -- Toute ressemblance avec des fautes d'orthographe, de grammaire ou de conjugaison existantes ou ayant existé serait entièrement fortuite et indépendante de la volonté de l'auteur.
Re: [HS] script perl avec redondances
Le mercredi 11 octobre 2006 à 15:12 +0200, Nicolas Roudninski a écrit : > Bonjour à tous, > > Je sais que je suis hors sujet mais j'ai un petit problème avec un > script perl. > Ce script est chargé de vérifier si j'ai des messages de mes amis. > tout fonctionne bien, sauf que, à la première vérification, le script > m'affiche une fois que j'ai un message (quand j'en ai un). A la > deuxième vérification, le script me dit *deux* fois que j'ai un message > (et je n'ai qu'un message !). A la troisième vérif : *trois* fois la > même chose, etc. > > Il y a donc quelque chose de mal écrit, mais je n'arrive pas à trouver > quoi... > > Si quelqu'un peut m'aider à y voir plus clair, ce serait super ! [...] > #--- > # Variables globales > # > my $xdlg = "/usr/bin/zenity"; > my $pop; > my $i; > my $nom; > my @amis; [...] > > sub read_data { > open DATAFILE, "$home_dir/amis.dat" > or die "Fichier introuvable !"; > while () { > chomp; > push @amis, $_."\n"; > } [...] > while (1) { > connection; > read_data; [...] C'est normal que tu _rajoutes_ tes amis dans le tableau @amis à chaque itération ? A la fin tu dois en avoir des amis :-) Juste une remarque, évite d'avoir autant de variables globales; pourquoi ne pas passer des paramètres aux fonctions ? Greg -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:" To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
[HS] script perl avec redondances
Bonjour à tous, Je sais que je suis hors sujet mais j'ai un petit problème avec un script perl. Ce script est chargé de vérifier si j'ai des messages de mes amis. tout fonctionne bien, sauf que, à la première vérification, le script m'affiche une fois que j'ai un message (quand j'en ai un). A la deuxième vérification, le script me dit *deux* fois que j'ai un message (et je n'ai qu'un message !). A la troisième vérif : *trois* fois la même chose, etc. Il y a donc quelque chose de mal écrit, mais je n'arrive pas à trouver quoi... Si quelqu'un peut m'aider à y voir plus clair, ce serait super ! Cordialement, PS1 : ci-dessou, le script (un peu long pour un message, je sais, mais je ne l'enverrai qu'une fois, c'est promis !) PS2 : le fichier amis.dat contient la liste de mes amis, un par ligne de la forme : Prénom Nom: [EMAIL PROTECTED] #!/usr/bin/perl -w # -*-coding: utf-8 -* use strict; use warnings; use Mail::POP3Client; #--- # Variables globales #--- my $xdlg = "/usr/bin/zenity"; my $pop; my $i; my $nom; my @amis; my $amis_data; my $email; #chomp(my $user = `whoami`); my $user = "nicolas"; chomp(my $home_dir = "/home/$user"); my $passwd = "XXX"; my $popuser = "popuser"; my $pophost = "pop.mail.fr"; #~ sub popconfig { #~ open POPCONFIG, "$home_dir/.verifmaim.conf" #~ } sub connection { print "Connection au serveur...\n"; $pop = new Mail::POP3Client(USER => $popuser, PASSWORD => $passwd, HOST=> $pophost ); } # -- end of subroutine connection -- sub read_data { open DATAFILE, "$home_dir/amis.dat" or die "Fichier introuvable !"; while () { chomp; push @amis, $_."\n"; } for ($i = 1; $i <= $pop->Count(); $i++) { foreach my $amis (@amis) { my @amis_data = split / *: */, $amis; $email = $amis_data[1]; chomp($email); $nom = $amis_data[0]; &compare; } } close DATAFILE; return ; } # -- end of subroutine read_data -- sub compare { foreach ( $pop->Head( $i ) ) { if (/From:.*$email/) { chomp; print "Un message de $nom [$email]\n"; my $adresse = $_; system"$xdlg --info --text 'Un message de $nom'"; } } return ; } # -- end of subroutine compare -- #--- # Programme principal #--- #~ system "stty -echo"; #~ print "entrez un mot de passe de connexion : "; #~ chomp($passwd = ); #~ print "\n"; #~ system "stty echo"; while (1) { connection; read_data; print "Deconection du serveur...\n"; $pop->Close(); print "Ok, sleep 180.\n\n"; sleep 180; } -- Nicolas Roudninski [EMAIL PROTECTED] -- Toute ressemblance avec des fautes d'orthographe, de grammaire ou de conjugaison existantes ou ayant existé serait entièrement fortuite et indépendante de la volonté de l'auteur.