Bonjour,
Je dois manipuler de très gros hash, ce qui cause des problèmes de mémoire. Une façon d'y remédier serait de stocker des références et là je me heurte à un problème.
Un exemple simple pour éclaircir la situation:
Retourne:
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 use strict; my %tab; $tab{'a'}='a1'; $tab{'b'}='b1'; my $reftab=\%tab; my %tab2; $tab2{\$reftab->{'a'}}{\$reftab->{'b'}}=1; print '\$reftab->{\'a\'}='.\$reftab->{'a'}."\n"; print '$reftab->{\'a\'}='.$reftab->{'a'}."\n"; my $reftabtmp=\$reftab->{'a'}; print "reftabtmp=$reftabtmp\n"; my $valinreftabtmp=$$reftabtmp; print "valinreftabtmp=$valinreftabtmp\n";
\$reftab->{'a'}=SCALAR(0x2086240)
$reftab->{'a'}=a1
reftabtmp=SCALAR(0x2086240)
valinreftabtmp=a1
Jusque là tout va bien !
Ajoutons maintenant une petite boucle, car bien sur mon but est ensuite de dépiler tab2 et de récupérer les valeurs stockées aux différentes adresses.
Ceci me retourne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 foreach my $ref1(keys %tab2) { print "ref1=$ref1\n"; my $element_at_ref1=$$ref1; print "element_at_ref1=$element_at_ref1\n"; }
ref1=SCALAR(0x2086240) Là, on d'accord, c'est cohérent
Mais la suite est: Can't use string ("SCALAR(0x2086240)") as a SCALAR ref while "strict refs" in use
Autrement dit, le comportement est différent dans une boucle.
J'ai tenté en virant le use strict et les my, à la place element_at_ref1 est vide au lieu d'une erreur. Et pas plus de succès avec use Data:umper;
Si quelqu'un voit ce qui cloche, il me rendrait vraiment service...
Merci !
S.
Partager