A workaround is to add a layer in between.
#!/usr/bin/perl -w
use strict;
use Scalar::Util qw(weaken);
my @data = (1, 2, 3);
weaken( my $indirection = \@data );
print time, " test 0: main start\n";
&gogogo();
print time, " test 3: main end\n";
sub gogogo {
print time, " test 1: func start\n";
my @h;
for (1 .. 200000) {
my %hash = (data => $indirection);
push @h, \%hash;
}
print time, " test 2: func end\n";
}
You'd have to change
my $data = $h[0]{data};
to
my $data = ${ $h[0]{data} };
if you use this workaround.