Unless it's been fixed recently, declaring anonymous recursive subs (without using Devel::Caller or the like) is leaky, so if you're declaring a lot of them (and hoping they get destroyed when they go out of scope) you can fix that with Scalar::Util::weaken:
use Scalar::Util qw(weaken);
{
my ($sub, $sub1);
$sub1 = $sub = sub {
my $num = shift;
return $num + $sub->($num-1) if $num >0;
return 0;
}
weaken($sub);
my $num = $sub->(5);
print "$num\n";
}