![]() |
| |||||||
![]() |
| | LinkBack | Thread Tools | Search this Thread | Display Modes |
| |||
| Sorry, another newbie question: I'm reading this very interesting book on Perl (Effective Perl Programming by Joseph N. Hall with Randal L. Schwartz), and here on page 110 there's an example of a call to a (prototyped) subroutine that requires 3 arguments: a coderef, a scalar, and an array, and here's the call: for_n {print "$_[0], $_[1]\n"} 2, @a; I understand the parentheses around the list of arguments are optional, and that the anonymous subroutine does not require the "sub" keyword, but what I don't understand is how the call gets away with not having a comma after the closing curly brace and before the 2. Can anyone shed some light on this for me? |
| |||
| Quoth "Dave Slayton" <evad.notyals@liamg.moc>: > Sorry, another newbie question: > > I'm reading this very interesting book on Perl (Effective Perl Programming > by Joseph N. Hall with Randal L. Schwartz), and here on page 110 there's an > example of a > call to a (prototyped) subroutine that requires 3 arguments: a coderef, a > scalar, and an array, and here's the call: > > for_n {print "$_[0], $_[1]\n"} 2, @a; > > I understand the parentheses around the list of arguments are optional, and > that the anonymous subroutine does not require the "sub" keyword, but what I > don't understand is how the call gets away with not having a comma after the > closing curly brace and before the 2. Can anyone shed some light on this > for me? It's a special case. Prototypes were introduced to allow you to write subs that parse like Perl builtins; so, to allow a map-like sub to be written, a sub with its first argument prototyped '&' will accept a bare block (without a comma) like this, and treat it as an anon sub. Actually, this is the only case where the sub keyword is optional: a sub prototyped as ($&$) would still need to be called like foo 1, sub {...}, 2; See perldoc perlsub for all the details. Ben -- BEGIN{*(=sub{$,=*)=sub{print@_};local($#,$;,$/)=@_;for(keys%{ #ben@morrow.me.uk $#}){/m/&&next;**=${$#}{$_};/(\w):/&&(&(($#.$_,$;.$+,$/),next);$/==\$*&&&)($;.$ _)}};*_=sub{for(@_){$|=(!$|||$_||&)(q) )));&((q:\:\::,q,,,\$_);$_&&&)("\n")}}}_ $J::u::s::t, $a::n: ::t::h::e::r, $P::e::r::l, $h::a::c::k::e::r, $, |
![]() |
| Thread Tools | Search this Thread |
| Display Modes | |
| |