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

Modules Perl Discussion :

Problème déclaration de variable dans un package


Sujet :

Modules Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut Problème déclaration de variable dans un package
    Bonjour,

    J'ai une fonction qui appartien à un package:
    J'ai une erreur de déclaration de variable au niveau de $keys.
    Voici ma fonction:
    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
     
    package TX2::BD;
     
    ...
    .....
    ........
     
    sub GetTotalMessages($_)
    {
        my $address=$_[0];
        my $month=$_[1];
        my @messages;
        my $date1.='01';
        my $date2.='31';
        my %trrcvdoc=(ADDRESS=>'ADDRESSE_EMETTEUR',DATE=>'DATE_RECEPTION_DOC');
        my %trsnddoc=(ADDRESS=>'ADDRESSE_RECEPTEUR',DATE=>'DATE_ENVOI_DOC');
        my %tables=(trrcvdoc=>\%trrcvdoc,trsnddoc=>\%trsnddoc);
     
        foreach my $keys (keys %tables)
        {
              my $requete="SELECT COUNT(*) FROM $keys ";
              if($address ne '*')
              {
                    $requete.="WHERE $tables{$keys{'ADDRESS'}}=\'$address\' ";
                    if($month ne '*')
                    {
     
                      $requete.="AND $tables{$keys{'DATE'}}>=\'$date2\' AND $tables{$keys{'DATE'}}<=\'$date2\'";
                    }
              }
              else
              {
                  if($month ne '*')
                  {
                      $requete.="WHERE $tables{$keys{'DATE'}}>=\'$date2\' AND $tables{$keys{'DATE'}}<=\'$date2\'";
                  }  
              }
     
              my $dbi=&TX2::Tools::Connexion();
                    my $req=$dbi->prepare($requete);
                    $req->execute();
                    my @res=$req->fetchrow_array();
                    push(@messages,$res[0]);
              &TX2::Tools::Deconnexion($dbi);
        }
     
     
        return \@messages;
    }

    Et voici une partie de l'erreur retournée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tue Aug 23 14:00:40 2005] [error] [client 127.0.0.1] Global symbol "%keys" requires explicit package name at c:/Perl/lib/TX2/BD.pm line 329.\n
    [Tue Aug 23 14:00:40 2005] [error] [client 127.0.0.1] Global symbol "%keys" requires explicit package name at c:/Perl/lib/TX2/BD.pm line 333.\n
    [Tue Aug 23 14:00:40 2005] [error] [client 127.0.0.1] Global symbol "%keys" requires explicit package name at c:/Perl/lib/TX2/BD.pm line 333.\n
    [Tue Aug 23 14:00:40 2005] [error] [client 127.0.0.1] Global symbol "%keys" requires explicit package name at c:/Perl/lib/TX2/BD.pm line 340.\n

    Pouvez vous me dire ce qu'il ne va pas s'il vous plait ????
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    "keys %hash" renvoie, comme son nom l'indique, la liste des clés de ton hash, donc des chaînes de caractères, alors tu comprends que cette ligne pose de petits problème à Perl :
    $requete.="WHERE $tables{$keys{'ADDRESS'}}=\'$address\' ";
    --
    Jedaï

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    J'ai contourné le problème (ce que je faisais avait pas de sens je crois en faisant ceci):

    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
     
    sub CountTotalMessages($_)
    {
        my $dbi=$_[0];
        my $address=$_[1];
        my $month=$_[2];
        my @messages;
        my $date1.='01';
        my $date2.='31';
        my %tables=('trrcvdoc'=>['ADDRESSE_EMETTEUR','DATE_RECEPTION_DOC'],'trsnddoc'=>['ADDRESSE_DESTINATAIRE','DATE_ENVOI_DOC']);
        my $keys;
        foreach $keys (keys %tables)
        {
              my $requete="SELECT COUNT(*) FROM $keys ";
              if($address ne '*')
              {
                    $requete.="WHERE $tables{$keys}[0]=\'$address\' ";
                    if($month ne '*')
                    {
     
                      $requete.="AND $tables{$keys}[1]>=\'$date2\' AND $tables{$keys}[1]<=\'$date2\'";
                    }
              }
              else
              {
                  if($month ne '*')
                  {
                      $requete.="WHERE $tables{$keys}[1]>=\'$date2\' AND $tables{$keys}[1]<=\'$date2\'";
                  }  
              }
     
             print "$requete\n";
                    my $req=$dbi->prepare($requete);
                    $req->execute();
                    my @res=$req->fetchrow_array();
                    push(@messages,$res[0]);
     
        }
     
     
        return \@messages;
    }
    Je crois que c'est mieux.

    PS: mais ceci dit ce que je voulais faire avec la ligne:
    $requete.="WHERE $tables{$keys{'ADDRESS'}}=\'$address\' ";
    était la chose suivante:
    %tables a pour clés 'trrcvdoc' et 'trsnddoc' qui pointent respectivement vers les hash %trrcvdoc et %trsnddoc

    donc quand je faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach my $keys (keys %tables)
    {
    $requete.="WHERE $tables{$keys{'ADDRESS'}}=\'$address\' ";
    }
    je voulais obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $requete.="WHERE $table{trrcvdoc{'ADDRESS'}}=\'$address'\";
    et
    $requete.="WHERE $table{trsnddoc{'ADDRESS'}}=\'$address'\";
    Mais je crois que, comme tu me l'as expliqué, c'ets ps bon car $keys est une chaine de caractère et donc pas compris comme un hash ??
    C'est bien ça ???

    et si j'avais fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach my $keys (keys %tables)
    {
    $requete.="WHERE $tables{\$$keys{'ADDRESS'}}=\'$address\' ";
    }
    ça n'aurait pas pu marcher ? est ce que je suis pas bien dans ma tête ??
    tout le monde est d'accord pour critiquer la pensée unique

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu n'es pas bien dans ta tête !
    Ce que tu veux, c'est la valeur de clé ADRESS dans le hash qui est la valeur de clé $keys dans %tables.
    Soit tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tables{$keys}{ADDRESS}
    En fait on devrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tables{$keys}->{ADDRESS}
    Parce que $tables{$keys} est une référence à un hash, mais Perl traduit tout seul car il n'y a pas ambiguité.

    --
    Jedaï

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/11/2007, 11h03
  2. [LG]variables dans procédure
    Par néo333 dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2003, 23h24
  3. comment recuperer une variable dans flash
    Par krépuscul dans le forum Flash
    Réponses: 30
    Dernier message: 16/10/2003, 09h40
  4. Réponses: 13
    Dernier message: 14/06/2003, 22h15
  5. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53

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