Comportement des références différent entre 5.8 et 5.14 - Perl - Programmation
Marsh Posté le 09-03-2013 à 18:19:17
Je ne comprends rien à ce que tu as fait:
Citation : Pour les hash de construction simple (hash{clé}->{valeur}), ça se passe super bien. |
Dans TraiteData(\%{$hash_simple1{valeur1}},
ton %hash_simple1 est défini comment?
$hash_simple1{cle1} (ie valeur1) c'est quoi? un scalaire? une référence a autre chose?
A+,
Marsh Posté le 09-03-2013 à 18:50:15
Mes hash simples sont des hash de hash.
Construits comme ceci :
$hash{clé1}->{val1}
$hash{clé1}->{val2}
$hash{clé1274}->{val1}
$hash{clé1274}->{val2}
etc
J'ai en gros par hash de hash une centaine de clés différentes et pour chacune d'elles, une trentaine de valeurs.
Mais c'est le hash de liste qui me pose des soucis, pas les hash de hash car j'ai testé les références de chacun et il n'y a que sur le hash de liste que ça bug.
Mon hash de liste contient lui aussi une centaine de clés et pour chaque clé, 5 valeurs. C'est construit comme suit :
$hash{clé1}[0] = val1
$hash{clé1}[1] = val2
$hash{clé1}[2] = val3
$hash{clé1}[3] = val4
$hash{clé1}[4] = val5
$hash{clé1274}[0] = val1
$hash{clé1274}[1] = val2
$hash{clé1274}[2] = val3
$hash{clé1274}[3] = val4
$hash{clé1274}[4] = val5
C'est lui qui passe pas sous Perl 5.14 alors que le compilateur ne sourcillait absolument pas depuis 6 ans sous Perl 5.8.
Marsh Posté le 09-03-2013 à 19:50:53
\%{$hash_de_liste{valeur1}}
ben ça devrait pas être plutôt
\@{$hash_de_liste{valeur1}}
car si %hash_de_liste est un hash de liste, $hash_de_liste{valeur1} est une référence à une liste, et donc on a la liste avec @{$hash_de_liste{valeur1}}
Noter que ce que tu fais est verbeux, puisque
\@{$hash_de_liste{valeur1}} et $hash_de_liste{valeur1} sont la même valeur scalaire
et idem pour tes \%{$hash_simple1{valeur1} qui sont des scalaires identiques à $hash_simple1{valeur1}
A+,
Marsh Posté le 09-03-2013 à 20:03:34
Je viens de tester rapidement, c'était bien cela:
Code :
|
ça marche, mais avec TraiteData(\%{$hs{toto}}, \%{$hl{zozo}}); j'ai ton message d'erreur.
Et bien sur, TraiteData($hs{toto}, $hl{zozo}); marche aussi et est plus simple.
A+,
Marsh Posté le 10-03-2013 à 14:40:01
Merci Gilou d'avoir pris de ton temps pour m'aider !
Evidemment, tu as raison et il m'a suffit de remplacer le % devant mon hash de liste par @ pour que ça fonctionne !
Ce qui signifie donc que Perl 5.6 et 5.8 étaient vachement permissifs sur mon code. Ca ne m'a jamais signalé la moindre erreur dans mes logs (canal STDERR que je redirige dans un fichier).
Encore merci !
Marsh Posté le 11-03-2013 à 13:12:15
Oui, Perl s'est beaucoup amélioré avec les releases récentes et a corrigé pas mal de bugs qui traînaient.
Par exemple, une des améliorations récentes (pour la sécurité) c'est que dorénavant, les clés des hashes sont accédées suivant un ordre aléatoire qui varie avec chaque exécution d'un script.
A+,
Marsh Posté le 11-03-2013 à 13:19:38
gilou a écrit : Oui, Perl s'est beaucoup amélioré avec les releases récentes et a corrigé pas mal de bugs qui traînaient. |
Ah ça, ça m'intéresse assez
Marsh Posté le 11-03-2013 à 15:32:50
Citation : Per process hash randomization |
Depuis la 5.17.6
A+,
Marsh Posté le 09-03-2013 à 17:54:00
Bonjour la Communauté
Je viens à vous parce que j'ai un léger soucis dans un script Perl conçu autrefois sous Perl 5.6, qui fonctionne nickel sous Perl 5.8 mais qui plante sous la 5.14.
L'objectif : migration d'un vieux Linux à un Linux plus récent. Je suis donc en train de tester les comportements de mes programmes personnels et je bloque sur l'un d'eux.
J'ai un hash de liste tout bête. Chaque clé du hash est bien évidemment unique et contient une liste de 5 valeurs.
J'alimente ce hash à partir d'un fichier txt contenant par ligne "clé, valeur1, valeur2, ..., valeur 5.
Mon hash de liste ressemble au final à ceci :
Comme vous le voyez, rien de bien méchant.
J'ai 6 hash que j'envoie dans une fonction et, bien entendu, j'utilise les références pour bien retrouver mes petits.
Pour les hash de construction simple (hash{clé}->{valeur}), ça se passe super bien.
Pour CE hash de liste (hash{clé}->[valeur]), ça fait planter le script lors de l'appel de la fonction.
L'appel de la fonction se fait comme ceci :
Le début de ma fonction TraiteData :
A l'appel de cette fonction, j'ai droit à un "NOT HASH REFERENCE".
J'ai isolé les hash un par un et j'ai trouvé que c'était mon hash de liste qui ne passait plus sous Perl 5.14 alors qu'il marche sous 5.8.
Qu'y a-t-il de mauvais dans ma syntaxe lorsque j'envoie la référence de mon hash de liste à la fonction ?
---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL