Depiler un hash de références
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:
Code:
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"; |
Retourne:
\$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.
Code:
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";
} |
Ceci me retourne:
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::Dumper;
Si quelqu'un voit ce qui cloche, il me rendrait vraiment service...
Merci !
S.