in reply to Re^2: Use of freed value in iteration
in thread Use of freed value in iteration

I succeeded in generating this error with a pure perl program (v5.10.1 (*) built for i686-cygwin-thread-multi-64int) with the following code:
#!/usr/bin/perl -w use strict; use Data::Dumper; $Data::Dumper::Indent = 1; my $hashref; for my $i0 (1..2) { for my $i1 (1..2) { for my $i2 (1..2) { $hashref->{"$i0"}{"$i0:$i1"}{"$i0:$i1:$i2"} = "$i0:$i1:$i2"; } } } deletehashlevel($hashref, 1); print Dumper($hashref); exit; sub athashleveldo { my ($h, $n, $action) = @_; if ($n==0) { $action->($h); } else { athashleveldo($_, $n-1, $action) for values %$h; } } sub deletehashlevel { my ($h, $n) = @_; athashleveldo($h, $n, sub { my %tmp; for my $key (keys %$h) { my $val = delete $h->{$key}; @tmp{keys %$val} = values %$val; } %$h = %tmp; }); } __END__
Running this program:
$ ./testhashdel Use of freed value in iteration at ./testhashdel line 27.
The error goes away when I apply the same solution as js1 did, replacing:
athashleveldo($_, $n-1, $action) for values %$h;
with
my @v = values %$h; athashleveldo($_, $n-1, $action) for @v;
Is this a bug in Perl, lurking to bite me at some later time?

Replies are listed 'Best First'.
Re^4: Use of freed value in iteration
by Discipulus (Canon) on Feb 26, 2024 at 12:36 UTC
    Hello,

    I confirm the problem with strawberry portable v5.12.3 32bit. The next I have is 5.20.3 and runs with no errors

    L*

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Re^4: Use of freed value in iteration
by choroba (Cardinal) on Apr 14, 2012 at 20:13 UTC
    No error in 5.14.2 for i586-linux-thread-multi.
Re^4: Use of freed value in iteration
by Sewi (Friar) on Jun 15, 2012 at 14:24 UTC
    Confirmed in perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi (debian squeeze) but not in perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi (Ubuntu 12.04 Precise).