in reply to Re^2: Massive Perl Memory Leak
in thread Massive Perl Memory Leak

1) Well, if you feel better using the & go ahead, just keep in mind that &foo(); and &foo; are two very different things. The first statement calls the foo() subroutine with no parameters while the second one calls it aliasing its @_ to the current @_. That is any changes to @_ made within foo() will affect the current subroutine!

2) No, the my affects only the variable, no its contents. So the ifpoll() receives a reference to the caller's %datahash and assigns the reference to its own variable $datahash. The my itself doesn't affect the %datahash in any way.

3) Per has to flatten hash assignments. It might make some optimizations like preallocating the right number of buckets, but it has to create a new hash anc copy the values. So that changing one hash doesn't affect the other.
The %newhash = %oldhash; makes a copy, not another name for the same "object".

Replies are listed 'Best First'.
Re^4: Massive Perl Memory Leak
by wagnerc (Sexton) on Jun 14, 2007 at 00:58 UTC
    but it has to create a new hash anc copy the values. So that changing one hash doesn't affect the other.
    Sort of. As we found out in other posts only the first dimension is truly copied. With a hash of hashes the sub hashes come over as references and both hashes refer to the same subhash references.

      Sure. The keys of the hash are strings, the values are scalars. And the values of the scalars are copied, even if the value is just a reference. It's the same as this:

      my $x = 999; my $r1 = \$x; my $r2 = $r1; print "\$r1=$r1\t\$r2=$r2\t\$\$r1=$$r1\t\$\$r2=$$r2\n"; $x = 111; print "\$r1=$r1\t\$r2=$r2\t\$\$r1=$$r1\t\$\$r2=$$r2\n"; ${$r1} = 555; print "\$r1=$r1\t\$r2=$r2\t\$\$r1=$$r1\t\$\$r2=$$r2\n"; ${$r1} = 777; print "\$r1=$r1\t\$r2=$r2\t\$\$r1=$$r1\t\$\$r2=$$r2\n";