http://qs321.pair.com?node_id=691091


in reply to Oh where has my memory gone?

Well, the first answer is a good one. Let me explain it a bit. You have this code inside manager():

sleep(2); &manager();

Every time a subroutine calls another subroutine, the stack grows. Each subroutine in the chain hangs onto whatever memory it has. When your stack gets big enough, you'll run out of memory or blow the stack -- both are fatal.

As an aside, you should really include use strict; use warnings; in your code -- you would have got a warning about deep recursion inside manager() long before you ran out of memory.

If you want to avoid this, you have two options: refactor your code so that manager() is just a loop, or use goto.

If you say goto &manager;, you're effectively1 making a jump, not a call -- your stack remains constant.

Also, you should read perlvar, specifically the bits on my - variables that you only need inside of manager should be declared with that scope using my

  1. As shmem explains below, it's not really implemented as a jump; however, the effect is so similar that the difference is unimportant for this convsersation. Still -- thanks to shmem for the clarification.

Updates:

<radiant.matrix>
Ramblings and references
“A positive attitude may not solve all your problems, but it will annoy enough people to make it worth the effort.” — Herm Albright
I haven't found a problem yet that can't be solved by a well-placed trebuchet