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 :

Probleme de references symboliques...


Sujet :

Langage Perl

  1. #1
    Invité
    Invité(e)
    Par défaut Probleme de references symboliques...
    Bonjour,
    je viens encore poser des questions qui vous paraitrons évidentes, mais bon, c'est en programmant que l'on devient programmeur...

    toujours avec mon logiciel de lecture de radios, je veux pouvoir avoir le choix du lecteur utilisé selon le format du stream, et j'aimerai que cela soit configurable par l'utilisateur.

    Donc, je me dit que je peux faire un package qui contient une fonctions qui liste une serie de package specifiques selon le format...

    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
     
    #!/usr/bin/perl -w
    #Player.pm
    use strict;                                                                      
     
    package Player;                                                                  
     
    %Player::list = ();                                                              
     
    sub list_player {                                                                
       no strict 'refs';                                                             
       foreach (glob ('Player/*.pm') ) {                                             
          my $name;                                                                  
          ($name = $_ ) =~ s/Player\/(.*)\.pm/$1/;                                   
          require 'Player/'.$name.'.pm';                                             
     
          my $format = 'Player::'.$name.'::format';                                  
          my $Pname  = 'Player::'.$name.'::name';                                    
          $Player::list{$$format} = $$Pname;                                         
     
       }                                                                             
       use strict 'refs';                                                            
       return %Player::list;                                                         
    }                                                                                
    1;
    les fichiers Player/*.pm sont du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    use strict;                                                                      
    package Player::ogg123;
     
    $Player::ogg123::name   = 'ogg123';
    $Player::ogg123::format = 'ogg';                                                 
    $Player::ogg123::opts   = '-q';                                                  
    $Player::ogg123::cache  = '--buffer ';                                           
     
    1;                                                                               
    __END__
    Le probleme est que dans la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $format = 'Player::'.$name.'::format';                                  
    my $Pname  = 'Player::'.$name.'::name';                                    
    $Player::list{$$format} = $$Pname;
    mon code est surement pas le bon...

    si quelqu'un pouvait me guider, ou alors me dire que ma methode est la pire qu'il n'ai jamais vu... Merci d'avance

  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
    Ta méthode est la pire que j'ai jamais vu !!

    Non, sérieusement, il me semble que tu t'embêtes beaucoup pour pas grand chose : à priori tes packages pour chaque format sont inutiles, car il n'y a pas de code dedans, juste des variables. Autant dans ce cas employer des simples fichiers de config que tu pourras parser et utiliser sans en passer par ces horribles contorsions et références symboliques...

    Par ailleurs, la manière standard de déclarer une variable globale aujourd'hui est d'utiliser le mot-clé "our", tu devrais donc écrire :
    au lieu de :
    En plus c'est plus court ! (dans le même registre : tant que tu restes à l'intérieur du package Player, il est inutile de qualifier complètement %Player::list, %list suffit, je trouve que ça améliore la lisibilité, mais c'est peut-être une question de goût !)

    Sinon, je te félicite pour ton esprit bien tordu : si tu continues dans cette voie, tu peux nous faire des modules bien intéressants !

    --
    Jedaï

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Jedai
    Ta méthode est la pire que j'ai jamais vu !!
    oups, c'est bien ce que je me disait...

    Non, sérieusement, il me semble que tu t'embêtes beaucoup pour pas grand chose : à priori tes packages pour chaque format sont inutiles, car il n'y a pas de code dedans, juste des variables. Autant dans ce cas employer des simples fichiers de config que tu pourras parser et utiliser sans en passer par ces horribles contorsions et références symboliques...
    oui, mais je ne sais pas trop comment faire...

    Par ailleurs, la manière standard de déclarer une variable globale aujourd'hui est d'utiliser le mot-clé "our", tu devrais donc écrire :
    au lieu de :
    En plus c'est plus court ! (dans le même registre : tant que tu restes à l'intérieur du package Player, il est inutile de qualifier complètement %Player::list, %list suffit, je trouve que ça améliore la lisibilité, mais c'est peut-être une question de goût !)
    ok, je prend tout de suite ca en compte

    Sinon, je te félicite pour ton esprit bien tordu : si tu continues dans cette voie, tu peux nous faire des modules bien intéressants !
    je prend ca comme un compliment...

    Bon, ca ne me resout pas mon probleme, un fichier de conf, serait plus simple donc...
    tu me conseille quelle syntaxe pour le fichier? (je sens venir le coup sur XML là...)

  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
    Si ton fichier de config contient juste les éléments de ton exemple, inutile de déployer la grosse artillerie XML... mais si ça t'amuse, ne te prive pas !

    Tu peux utiliser des outils comme App::Config, ou même parser le fichier à la main, ce qui est aussi simple que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (glob ('Player/*.conf') ) {                                             
      (my $name = $_ ) =~ s/Player\/(.*)\.conf/$1/;                                                               
      open( my $conf, '<', $_ ) or die "Ne peut pas lire $_ : $!\n";
      while( <$conf> ){
        s/^\s*//;s/\s*$//;
        my( $var, $value) = split /\s*=\s*/, $_;
        list{$name}{$var} = $value if $value;
      }
    }
    avec un fichier de config formaté comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    name   = ogg123
    format = ogg                                         
    opts   = -q                                                 
    cache  = --buffer
    Y a peut-être un petit problème sur le open() si le répertoire courant n'est pas le bon, dans ce cas il suffit de récupérer le chemin vers Player.pm en utilisant @INC avant.

    --
    Jedaï

  5. #5
    Invité
    Invité(e)
    Par défaut
    je pense qu eje vais faire ca à la main, avec ta methode merci...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Une petite erreur s'est glissé dans le code de Jedai, je la corrige ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (glob ('Player/*.conf') ) {                                             
      (my $name = $_ ) =~ s/Player\/(.*)\.conf/$1/;                                                               
      open( my $conf, '<', $_ ) or die "Ne peut pas lire $_ : $!\n";
      while( <$conf> ){
        s/^\s*//;s/\s*$//;
        my( $var, $value) = split /\s*=\s*/, $_;
        $list{$name}{$var} = $value if $value;
      }
    }
    Merci beaucoup, ca marche tout seul...

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/09/2012, 01h50
  2. Réponses: 1
    Dernier message: 19/07/2007, 15h09
  3. pti probleme de reference
    Par nassu dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/05/2006, 21h09
  4. Problème de lien symbolique pour le plugin java avec firefox
    Par HNT dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 18/03/2006, 19h50
  5. Probleme heritage : References sur la table parente
    Par Belgar dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 03/05/2005, 22h11

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