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 :

"keys on reference is experimental"


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut "keys on reference is experimental"
    Bonjours à tous,

    Je suis en plein projet perl pour mon master bioinformatique et je commence à voir des lignes d'erreurs s'accumuler: "keys on reference is experimental".
    D'après ce que j'ai trouver sur c'est un problème qui peut arriver au niveau de l'appel de clefs d'un hash (keys(%{$_ ,et en effet je fais de la lecture de fichier donc beaucoup de hash pour stocker et traité des données.
    Au final j'ai pas encore compris comment arranger ça, et mon prof n'a pu m'aider quant je lui ai montré.

    Après en sois le programme fonctionne, mais les erreurs qui s'affichent au début c'est juste moche. Et vu le temps qui j'y passe j'aimerais rendre un truc cool.

    Es-ce que quelqu'un a déjà vu ça?

    mercii,
    P.

    ps: je travaille sur notepad++ avec strawberry perl 5.22

  2. #2
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Bonjour,

    ce ne sont pas des erreurs mais des warnings. Si tu regardes ton code aux lignes indiquées tu dois trouver des expressions keys EXPR où EXPR est effectivement une référence sur un hash, et non un hash. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Taisha:~/perl/forum $ perl -E 'my $h = { a => 1, b => 2 }; say +keys $h'
    keys on reference is experimental at -e line 1.
    ba
    Taisha:~/perl/forum $
    Pour faire disparaître le warning il suffit de forcer le déréférencement en hash en utilisant %{ ... } autour de la référence (ou en préfixant par % dans les cas simples) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Taisha:~/perl/forum $ perl -E 'my $h = { a => 1, b => 2 }; say +keys %{$h}'
    ba
    Taisha:~/perl/forum $ perl -E 'my $h = { a => 1, b => 2 }; say +keys %$h'
    ba
    Taisha:~/perl/forum $
    Cela permettra également à ton code de tourner sur des versions plus anciennes de perl...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Ok, je n'ai pas tout compris et en tout cas je ne vois pas quoi changer dans mon code, désolé je suis débutant...

    L'erreur ne s'affiche pas dans tout les cas, exemple :

    foreach my $k1(keys{%sousfamille}){ --> warning
    foreach my $k2(keys(%{$sousfamille{$k1}})){ --> pas de warning

    plus loin :

    foreach my $k(keys(%clusters)){ --> pas de warning
    foreach my $k2(keys(%{$clusters{$k}})){ --> pas de warning


    J'ai aussi un nouveau warning sur if(keys($clusters{$k})>2)

    Es-ce que ça vient de ma syntaxe du coup?

  4. #4
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par PaulEndymion Voir le message
    Ok, je n'ai pas tout compris et en tout cas je ne vois pas quoi changer dans mon code, désolé je suis débutant...
    Il va falloir que tu apprennes à faire la différence entre un hash et une référence à un hash.

    Citation Envoyé par PaulEndymion Voir le message
    L'erreur ne s'affiche pas dans tout les cas, exemple :

    foreach my $k1(keys{%sousfamille}){ --> warning
    keys est un opérateur, pas une fonction, et est normalement invoqué par keys %h. Autrement dit, sauf pour lever des ambiguïtés, il n'est pas nécessaire de mettre des parenthèses comme dans keys(%h).

    Ici, {%sousfamille} crée une référence à un hash, via { ... }, initialisé par une copie superficielle de %sousfamille. Je doute que cela soit voulu

    Remplace cette ligne par foreach my $k1 (keys %sousfamille) {.


    Citation Envoyé par PaulEndymion Voir le message
    foreach my $k2(keys(%{$sousfamille{$k1}})){ --> pas de warning

    plus loin :

    foreach my $k(keys(%clusters)){ --> pas de warning
    foreach my $k2(keys(%{$clusters{$k}})){ --> pas de warning
    Ca ne me choque pas à ceci près que j'écrirais sans doute plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $k2 (keys %{ $sousfamille{$k1} }) { ... } 
    foreach my $k  (keys %clusters) { ... }
    foreach my $k2 (keys %{ $clusters{$k} }) { ... }
    mais j'admets que c'est purement cosmétique.

    Citation Envoyé par PaulEndymion Voir le message

    J'ai aussi un nouveau warning sur if(keys($clusters{$k})>2)

    Es-ce que ça vient de ma syntaxe du coup?
    Ehhh oui... .

    $clusters{$k} renvoie une référence à un hash. Pour la passer à keys, il faut la déréférencer via %{ ... }, comme suit : if (keys(@{ $clusters{$k} }) > 2).

    perlref, perldsc, perllol (entre autres) sont tes amis

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Mais oui bien sûre en relisant les lignes j'ai vu le problème de syntaxe : "{" au lieu de "(" (qui n'est donc pas obligatoire). Pour mon "if" j'avais oublié le "%". J'ai donc écrit: if (keys %{ $clusters{$k} } > 2) {...}

    Je n'ai plus aucun message d'avertissements à présent, +1 pour la pédagogie.

    Es-ce qu'une "référence à un hash" est une sorte de "pointeur sur le hash" du coup?

    Merci beaucoup de ton aide en tout cas et je vais essayer d'utiliser des tableaux de code la prochaine fois, comme sur vos messages, pour plus de lisibilité.

  6. #6
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par PaulEndymion Voir le message
    Mais oui bien sûre en relisant les lignes j'ai vu le problème de syntaxe : "{" au lieu de "(" (qui n'est donc pas obligatoire). Pour mon "if" j'avais oublié le "%". J'ai donc écrit: if (keys %{ $clusters{$k} } > 2) {...}

    Je n'ai plus aucun message d'avertissements à présent, +1 pour la pédagogie.
    De rien. Bienvenue sur ces forums Incidemment, une bonne manière de montrer ton appréciation est de cliquer sur (ou ) en bas à droite des messages que tu trouves utiles (ou inversement).

    Citation Envoyé par PaulEndymion Voir le message
    Es-ce qu'une "référence à un hash" est une sorte de "pointeur sur le hash" du coup?
    En quelque sorte, mais en beaucoup plus puissant. Suis les liens que je t'ai donné précédemment et jette un oeil sur la doc (perlref et perldsc en particulier).

    Citation Envoyé par PaulEndymion Voir le message
    Merci beaucoup de ton aide en tout cas et je vais essayer d'utiliser des tableaux de code la prochaine fois, comme sur vos messages, pour plus de lisibilité.
    La doc de la liste des balises utilisable est . Elle ne mentionne pas CODEINLINE, qui existe pourtant et est très pratique.

    N'oublie pas également que toi seul peut marquer une discussion comme résolue.

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

Discussions similaires

  1. foreign key sans reference
    Par malvax dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/04/2010, 12h01

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