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 :

Message : Not an ARRAY reference, parfois, parfois pas


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut Message : Not an ARRAY reference, parfois, parfois pas
    Bonjour,

    Voulant faire un tri schwartzien, j'ai eu comme message "Not an ARRAY reference at Epingle.pm line 850."
    J'ai retravailler le code en le minimisant pour chercher l'erreur, et si j'exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my  @sc=   map { [$_, -$_] } (20,23);
    say @sc;
    say Dumper @sc;
    say Dumper sort { $a->[1] <=> $b->[1] } @sc;
    dans un petit fichier qui ne fait que ça, j'ai le bon résultat.

    Si je l'exécute dans mon programme Kandela (plein de ligne, Moose,...), j'ai le message indiqué, ici, sur la ligne 4.(les 2 premiers say étant bien les mêmes)
    J'exécute bien des "sort" ailleurs dans un contexte plus classique sans problème.
    J'imagine donc un problème de contexte, mais je ne vois pas par quel bout attaquer le problème.

    Une idée ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je ne vois rien d'incorrect dans le code que tu as présenté, et je ne vois pas comment il pourrait produire l'erreur que tu mentionnes. Il faudrait que tu montres le bout de code réel produisant cette erreur.

    Cela dit, faire une pseudo transformation de Schwartz pour un cas aussi simple me paraît inutilement complexe. Déjà, tu n'as pas besoin de générer un tableau de tableaux, mais peux transformer directement les données en entrée puis en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      DB<1> print Dumper map -$_, sort {$a <=> $b} map -$_, (20,23);
    $VAR1 = 23;
    $VAR2 = 20;
    L'inversion du signe étant une transformation très peu coûteuse, tu peux aussi le faire directement dans le sort, cela ne pénalisera pas les performances de façon mesurable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      DB<2>  print join "\n", sort {-$a <=> -$b}  (20, 23, 25);
    25
    23
    20

    Ou, plus simplement encore, modifier le tri en intervertissant $a et $b:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      DB<3> print join "\n", sort {$b <=> $a} (20, 23, 25);
    25
    23
    20
    ce qui devrait donner a priori le même résultat pour tous les cas de figure auxquels je peux penser.

    Ou encore appliquer la fonction reverse au résultat du tri:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      DB<4>  print join "\n", reverse  sort {$a <=> $b}  (20, 23, 25);
    25
    23
    20

  3. #3
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Bonjour,

    Je me suis mal fait comprendre.

    Le code que je donne est en effet correct, et fonctionne si on le met dans un simple fichier qui ne fait que ça. L'exemple que je donne est une simplification à outrance de quelque chose de bien plus compliqué, mais qui fait appel à des objets,...

    Mon but n'est donc pas de trier par ordre décroissant, mais de montrer que ce code dysfonctionne dans mon programme, je pense qu'il y a donc un problème de contexte, et je n'ai que ce message d'erreur comme piste.

    Entre temps j'ai essayé perl -d, mais sans plus de résultat. Un 's' sur la ligne du "sort" me renvoie la même erreur.

    PS : Je précise donc, que c'est bien le même code qui fonctionne dans un simple fichier, et pas dans mon programme.

  4. #4
    Membre chevronné 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
    Par défaut
    Citation Envoyé par alainbb Voir le message
    Entre temps j'ai essayé perl -d, mais sans plus de résultat. Un 's' sur la ligne du "sort" me renvoie la même erreur.
    bizarre... Essaie peut-être de rajouter une impression de debug dans le corps du sort pour voir ce qu'il reçoit dans $a et $b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... sort { print Dumper($a); print Dumper($b); ... } ...

  5. #5
    Membre chevronné 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
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    bizarre... Essaie peut-être de rajouter une impression de debug dans le corps du sort pour voir ce qu'il reçoit dans $a et $b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... sort { print Dumper($a); print Dumper($b); ... } ...
    En fait si tu travailles sur une grosse liste et que le problème est intermittent essaie plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... sort { if (!ref $a or ref $a ne 'ARRAY' or !ref $b or ref $b ne 'ARRAY') { die "\$a: ", Dumper($a), "\$b: ", Dumper($b) } ... } ...
    qui devrait être plus facile à exploiter...

  6. #6
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Bonjour,

    En mode debug, j'ai le même résultat, par contre un say Dumper dans le "sort" me donne en effet quelque chose d'assez bizarre.
    Il me donne (en normal ou en debug)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $VAR1 = [
              20,
              -20
            ];
    $VAR1 = bless( {
                     'circleType' => 'arc',
                     'color2' => 'red',
                     'arcs' => [
    ...
                     'width' => 3,
                     'ordre_tri' => 1
                   }, 'Epingle' );
    Tk::Error: Not an ARRAY reference at Epingle.pm line 850.
    (le Tk::Error peut-être ignoré, il apparait seulement si je provoque l'erreur via l'interface graphique)
    Le Dumper($b) renvoie donc, non pas une array, mais un objet Epingle. J'utilise Moose, et mon code se trouve dans Epingle.pm.
    J'ai déjà eu un problème similaire mais je n'avais pas réussi à le minimiser comme celui-ci, et je l'ai finalement contourné.

    Voici mon code, il est pas des plus clean (si mon nouveau serveur Raspberry daigne ne pas planter)
    http://www.barbason.be/bug/
    vous lancer le programme avec ./kandela.pl -file bruxelles.lace
    Vous verrez 25 cercles reliés entre eux. Faites un "Ctrl-e" (erase), un click-gauche souris-glisser sur une cercle, qui devrait disparaitre et le message d'erreur honni apparaître. Ligne 847-850 dans Epingle.pm
    Bon, je vais essayer de cibler l'erreur, je peux déjà dire que si je mets les 4 lignes dans le main (kandela.pl/sub init), elles fonctionnent correctement.

    Os : Debian Jessie

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    J'ai bien compris, mais je ne peux pas trop t'aider sans voir le vrai code produisant l'erreur.

    Citation Envoyé par alainbb Voir le message
    Entre temps j'ai essayé perl -d, mais sans plus de résultat. Un 's' sur la ligne du "sort" me renvoie la même erreur.
    Retente en mode debug comme ceci: juste avant d’exécuter la ligne comportant le sort en mode debug, fait un "x" sur le tableau pour voir sa structure, ou mieux sur une référence vers ce tableau. Et, si ça ne te donne pas l'explication, poste le résultat.

    Exemple de session de débogage avec le bout de code qui tu as posté dans le premier message:
    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
    $ perl -dE '
    > my  @sc=   map { [$_, -$_] } (20,23);
    > say @sc;
    > say Dumper @sc;
    > say Dumper sort { $a->[1] <=> $b->[1] } @sc;
    > '
    
    Loading DB routines from perl5db.pl version 1.33
    Editor support available.
    
    Enter h or `h h' for help, or `man perldebug' for more help.
    
    main::(-e:2):   my  @sc=   map { [$_, -$_] } (20,23);
      DB<1> s
    main::(-e:2):   my  @sc=   map { [$_, -$_] } (20,23);
      DB<1> s
    main::(-e:2):   my  @sc=   map { [$_, -$_] } (20,23);
      DB<1> s
    main::(-e:3):   say @sc;
      DB<1> s
    ARRAY(0x60005f250)ARRAY(0x60005f2e0)
    main::(-e:4):   say Dumper @sc;
      DB<1> s
    main::(-e:5):   say Dumper sort { $a->[1] <=> $b->[1] } @sc;
      DB<1> x @sc
    0  ARRAY(0x60005f250)
       0  20
       1  '-20'
    1  ARRAY(0x60005f2e0)
       0  23
       1  '-23'
      DB<2> x \@sc;
    0  ARRAY(0x6000674c0)
       0  ARRAY(0x60005f250)
          0  20
          1  '-20'
       1  ARRAY(0x60005f2e0)
          0  23
          1  '-23'
      DB<3>
    La deuxième commande en rouge ci-dessus est l'équivalent de ce que tu dois faire avec ton programme.

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

Discussions similaires

  1. [ XML::Simple] Problème "Not an ARRAY reference"
    Par Sweet dans le forum Modules
    Réponses: 3
    Dernier message: 14/01/2014, 16h36
  2. Réponses: 1
    Dernier message: 13/02/2012, 11h16
  3. jQuery erreur "Warning:" parfois mais pas tout le temps
    Par elizabeth dans le forum jQuery
    Réponses: 6
    Dernier message: 02/01/2012, 11h30
  4. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  5. Réponses: 2
    Dernier message: 07/09/2005, 09h55

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