in reply to Re^4: passing subroutine references
in thread passing subroutine references

Global? There ain't any global sir.

Global to all calls to hanoi. External? Non-local? Yet highly coupled.

And _hanoi(@_); would work just as well

That's what I said.

while your tricks with local are unavoidable.

How is localising a var "a trick"? Dealing with package vars is a necessity in Perl, and the first thing you need to know is how to localise them.

It is avoidable, but it's messy and requires a trick to avoid a memory leak.

my $_hanoi; # \ Messy line break $_hanoi = sub { # / ... $_hanoi->(...); # Relatively messy syntax ... }; $_hanoi->(...); undef $_hanoi; # Messy hack to avoid mem leak.

Using local actually cleans up a whole of mess.

Besides the problem is not the local itself, but the typeglob handling.

"The typeglob handling" makes "setting a typeglob" sound falsely ominous. It's a manufactured problem.

What debugging complexities are you speaking of?

The removal of a stack frame creates lying stack traces, not just to users but to debugging tools.

Replies are listed 'Best First'.
Re^6: passing subroutine references
by Jenda (Abbot) on Sep 20, 2009 at 21:51 UTC

    It's static and lexical to two subroutines.

    And yes, localizing a var is a trick. Something that confuses most newcomers to Perl. Localizing a whole typeglob so that you could call the newly created closure as if it was an ordinary subroutine doubly so. If you insist on using local(), localize the $move_disk and define the _hanoi() as an ordinary subroutine accessing the package variable $move_disk.

    BTW, what was the last time you actually generated a stack trace?

    Jenda
    Enoch was right!
    Enjoy the last years of Rome.

      BTW, what was the last time you actually generated a stack trace?

      I used confess and code analysers on my previous workday.

      define the _hanoi() as an ordinary subroutine accessing the package variable $move_disk.

      Yeah, you could make _hanoi public, but it doesn't buy you anything to do so.

      <bockquote>

      BTW, what was the last time you actually generated a stack trace?

      I used confess and code analysers on my previous workday.

      define the _hanoi() as an ordinary subroutine accessing the package variable $move_disk.

      Yeah, you could make _hanoi public, but it doesn't buy you anything to do so.