IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[langage] Bareword "FH" not allowed while "strict subs"


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 67
    Par défaut [langage] Bareword "FH" not allowed while "strict subs"
    Hello,

    Je tente de lire un email via pop 3 et suis rudement bloquée !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #!/usr/bin/perl -w
        use strict;
        use Net::POP3;
        use Net::SMTP;
        use MIME::Parser;
        use MIME::Entity;
        use MIME::Lite;
        use POSIX 'strftime';
        use strict;
     
        my $server = 'mail.test.ch';      
        my $login  = 'test';  
        my $passwd = 'test';       
        my $nbMessage = 0;
        my $size = 0;
     
        # Tentative de connection au serveur de messagerie
        my $pop = Net::POP3->new($server)
          or die "Impossible de se connecter au serveur ".$server."\n";
     
        # Tentative d'autentification 
        $pop->login($login, $passwd)
          or die "Impossible de se connecter sur le compte ".$login."\n"; 
     
        # On récupère le nombre de message et la taille actuelle de la boîte
        ($nbMessage, $size) = $pop->popstat; 
     
        print "\t--> Le nombre de message est : ".$nbMessage."\n".
              "\t--> La taille de la boite est : ".$size."\n\n";
     
        # On essaie de récupérer les message afin de les traiter
        for my $i (1..$nbMessage) {
          # On récupère le mail
          my $mail = $pop->get($i,FH);
     
          #print @$mail;
     
          print "\t--> Récupération du mail ".$i."\n";
     
          # On recherche les différentes partie MIME 
          my $parser = MIME::Parser->new();
          my $entity = $parser->parse(\*FH);
     
        #$pop->quit();
     
        my($body,$image_encoded);
     
        for($entity->parts()) {
            my $corps = $_->body();
            my $head = $_->head()->as_string;
     
            $body = join '', @$corps if $head =~ /content-type: text\/plain/is;
            $image_encoded = join '', @$corps if $head =~ /content-type: image\//is;
        }
     
        # obtention de la date sous la forme d'une chaîne aaaammjj 
        my $time = strftime("%Y%m%d", localtime);
        my $image_name = "imageEnfin_$time.jpg";
        my $message_name = "messageEnfin-$time.txt";
     
        open W, "/home/sguerid/Perl/POP3_IMAP/$message_name"
          or die "ne peut créer le fichier $message_name\n";
        print W $body;
        close W;
     
        open W, "/home/sguerid/Perl/POP3_IMAP/$image_name"
          or die "ne peut créer le fichier $image_name\n";
        print W decode_base64($image_encoded);
        close W;
      }
    Je ne capte pas pouquoi il bloque sur mon filehandler, quelqu'un pourrait-il m'apporter un peu de cette lumière qui m'échappe ?

    Ps l'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Bareword "FH" not allowed while "strict subs" in use at test2.pl line 34.
    Execution of test2.pl aborted due to compilation errors.
    Un grand merci !

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    La coloration syntaxique aurait pu te mettre la puce à l'oreille.

    Particulièrement dans cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $server = 'mail.test.ch';      
        my $login  = test';  
        my $passwd = 'test';
    Il manque la simple quote ouvrante, dans l'affectation à $login.

  3. #3
    Membre expérimenté Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Par défaut
    t'as juste oublié un simple quote sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       my $login  = 'test';
    du coup il a du mal à gérer le reste

    Edit : boudiou, 3 à répondre en même temps, ça se bouscule aujourdh'ui et évidemment je suis grillé 2 fois !

  4. #4
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Question de style, donc pas obligé d'écouter ce que je dis, mais je préfère utiliser des variables scalaires plutôt que des barewords pour me file handles.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Vincent aime pas
    open FH, '<', 'fichier';
     
    # Vincent aime :)
    open(my $fh, '<', 'fichier');
    Ça fonctionne pas avec toutes les versions de Perl par contre.

  5. #5
    Membre expérimenté Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Par défaut
    quand tu dis que tu n'aimes pas, y a-t'il une raison autre que stylistique dans l'utilisation d'une scalaire au lieu du file handler ?

  6. #6
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    quand tu dis que tu n'aimes pas, y a-t'il une raison autre que stylistique dans l'utilisation d'une scalaire au lieu du file handler ?
    Dans le chapître 10 du livre de Damian Conway, Perl Best Practices, une explication en détails est fournie.

    Un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    use POSIX;
     
    open EXDEV, '<', $fichier or die("$!");
    my $ligne = <EXDEV>;
    Est-ce que le code précédant fonctionne? Non. Pourquoi? Parce que EXDEV a une valeur (18), donc dans la table des symboles c'est *18 qui est le file handle de $fichier. Donc pour lire une ligne on doit dire:

    Il y a aussi le problème que si on ouvre un second fichier en utilisant le même bareword comme file handle, le premier fichier sera fermé. C'est sûrement pas ce que l'on désire.

    En utilisant un scalaire (appelé indirect filehandle dans ce cas-ci), on obtient un avertissement si on essaie de réutiliser la même variable pour ouvrir un second fichier et c'est une variable lexicale, donc pas de problème avec le code de quelqu'un d'autre.

    Pour l'explication complète et beaucoup plus claire que la mienne, procure toi le livre de Damian Conway. 256 trucs pour que ton Perl soit plus lisible et robuste.

  7. #7
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Bonjour.

    Si j'ai bien compris, la méthode get attend un entier et un handle de fichier. Mais dans ton code, je ne vois pas où tu as ouvert le fichier de handle FH. Le problème vient sans doute de là

    €dit : ah bah tient, j'avais bien vu qu'il y avait une erreur de coloration syntaxique, mais j'avais pas vu où
    Mais je pense que ce n'est pas le seul problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/06/2009, 15h05
  2. Bareword not allowed while "strict subs" in use at
    Par MohEllayali dans le forum Langage
    Réponses: 0
    Dernier message: 09/05/2009, 18h12
  3. String literal is not properly closed by a double-quote
    Par soufiane10 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 24/03/2009, 23h22
  4. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  5. erreur Host not allowed to connect
    Par ziboux dans le forum Outils
    Réponses: 9
    Dernier message: 16/10/2003, 05h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo