Hi Todd Chester,
Perl's prototypes are sometimes misunderstood to be something like function type signatures, but that's exactly not what they are. In Perl, Prototypes influence not only what subroutine arguments are accepted, but how the calls to those subroutines are parsed. They're not necessarily the best thing for validating subroutine arguments, and can sometimes lead to confusing code. I'd recommend Perl's prototypes primarily for cases where one wants to create functions whose syntax imitates Perl builtins.
In your case, it's the "( $ )" immediately after sub RmdirAndLoop, which makes calls to RmdirAndLoop be parsed like a unary operator. Unless it is your intention to change how calls to RmdirAndLoop are parsed, as the AM said it's perfectly fine to remove the "( $ )" prototype, and if desired add code to check the arguments.
Just for completeness, there is another way to get rid of the warning, from the bottom of the Prototypes doc:
If a sub has both a PROTO and a BLOCK, the prototype is not applied until after the BLOCK is completely defined. This means that a recursive function with a prototype has to be predeclared for the prototype to take effect, like so:
sub foo($$); sub foo($$) { foo 1, 2; }
Hope this helps,
-- Hauke D
In reply to Re: What are the rules on calling myself?
by haukex
in thread What are the rules on calling myself?
by Todd Chester
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |