This is reminiscent of a common trick in (untyped) lambda calculus to make a function recursive -- called a Y combinator.

In fact, using a standard Y combinator, you don't have to change the public interface to the function -- you use currying to fix the extra parameter that is introduced:

my $func = sub { my ($call_next, $param1, $param2) = @_; do { something }; $call_next->($call_next, $newparam1, $newparam2); }; my $nice_func = sub { $func->($func, @_) }; ## now you don't have a bizarre calling convention: $nice_func->(param1, param2);
I also like this better than your example because it doesn't use the $func variable confusingly in 2 different scopes (when I saw your original code, I had to think hard about whether you introduced a cyclic reference for $func).

Update: I should add that this won't result in a cyclic reference like the approaches in the previous replies.

See also: Re: recursive anonymous subroutines and this entry from Aristotle's use.perl journal.

blokhead


In reply to Re: private recursive subroutines by blokhead
in thread private recursive subroutines by Sixtease

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.