in reply to deleteing references

In your example, the hash references and the original array reference are all freed when when the last line is executed. If any part of the structure contained objects, that's when their DESTROY methods would be called.

Perl uses reference counting to determine when to free memory, so you mostly don't have to worry about it unless you've created a circular reference. For example:

my $ar = []; push @{$ar}, $ar; # $ar can only be destroyed manually.

In that case, you'd have to walk around your structure and undef the relevant references manually. Another way to handle this is with weaken in Scalar::Util. weaken makes a reference "weak" so that it doesn't count toward the reference count. With that, you can make your circular references weak, and destruction will happen normally. Note that a copy of a weak reference is not weak.

use Scalar::Util qw( weaken is_weak ); my $ar = []; push @{ $ar }, weaken $ar; # $ar will be destroyed normally. if ( is_weak $ar->[0] ) { print "First list item is weak\n"; } my $copy = $ar->[0]; if ( ! is_weak $copy ) { print "copy is not weak\n"; }

Finally, you asked about real memory being freed in a mod_perl environment. When perl releases some data structure, it doesn't necessarily return that memory to the OS. It will keep it and use it again when another data structure wants it.