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 : 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";
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 : 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";
}
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:umper;

Si quelqu'un voit ce qui cloche, il me rendrait vraiment service...

Merci !
S.