in reply to Use of freed value in iteration

I played around with this a bit more this morning (actually quite a long time!), and finally got it working. I did try out the data dumper (thanks for that suggestion) although I'm not sure it gave me anything useful. I changed this line:
foreach $uid (keys %{$systems{$sys}}){
to this:
@userids=keys %{$systems{$sys}}; foreach $uid (@userids){
and after that it all worked smoothly again. Does anyone know what this is any different?

Replies are listed 'Best First'.
Re^2: Use of freed value in iteration
by salva (Canon) on Sep 09, 2005 at 16:54 UTC
    Does anyone know what this is any different?

    Yes, there is a bug on one of the modules you are using, that returns perl scalars with a wrong reference count. Perl perform an integrity check looking for this kind of errors inside for loops and that was why you were seeing the "Use of freed value in iteration" message.

    And now, you are not using the faulty values, but copies of them (@userids). Perl doesn't see any problem because it's not looking at the faulty values any more... but that doesn't mean you have solved it, it's just hidden, waiting to crash your program at any time!!!

      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?
        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.
        No error in 5.14.2 for i586-linux-thread-multi.
        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).