On Jun 1, 9:58 am, [EMAIL PROTECTED] (Chas Owens) wrote:
> On 31 May 2007 10:58:54 -0700, Paul Lalli <[EMAIL PROTECTED]> wrote:
>
> > On May 31, 10:15 am, [EMAIL PROTECTED] (Yitzle) wrote:
> > > I suspect one of the tutorials that Google or Perl.org points to has
> > > something in it that needs correcting.
>
> > Actually, it's an unfortunate truth that up until Edition 3, the Llama
> > itself recommended that you use the & to call subroutines...
>
> > Paul Lalli
>
> Alright, I am a pedantic jerk, but this struck as wrong. I learned on
> 2nd edition Llama and Camel, so I dug up my old copies. Learning Perl
> 2nd Edition says on page 92
>
> The subname is th name of the subroutine, which is any name like
> the names we've has for scalar variables, arrays, and hashes. Once
> again, these come from a different namespace, so you can have a
> scalar variable $fred, an array @fred, a hash %fred, and now a
> subroutine fred*.
>
> * Technically, the subroutine's name is &fred, but you seldom need
> to call it that.
>
> Also, on page 93 it says
>
> Invoking a User Function
> You invoke a subroutine from within any expression by following
> the subroutine
> name with parentheses, as in:
>
> say_hello(); # a simple expression
> $a = 3 + say_hello(); # part of a larger expression
> for ($x = start_value(); $x < end_value(); $x += increment()) {
> ...
> } # invoke three subroutines to define values
>
> I checked Programming Perl (2nd Edition), just in case you meant the
> Camel instead of the Llama, and it appears* to talk about subroutines
> in the same was as perlsub currently does with no specific
> recommendations about whether to use & or not (it just explains all of
> the options and their side effects).
>
> The Llama (2nd edition) was published in 1997. That was ten years
> ago. You can see why I want to know where these people who are new to
> Perl are being told to use & as part of the subroutine name. I assume
> there are some old tutorials out there (things live forever on the
> Internet) and they are reading bad, old code at work.
>
> * there may be a recommendation somewhere, but I couldn't find one in
> my cursory glance through it.
One thing I wonder about is that I see anonymous subs called
as &$anon or &$anon() in various places in the docs, e.g., perlipc,
perlmod, perlmodlib, perlref, -q What's a closure, -q How can I
pass/return a Function. perl5004delta says:
New and changed syntax
$coderef->(PARAMS)
A subroutine reference may now be suffixed with an
arrow and a (possibly empty) parameter list. This
syntax denotes a call of the referenced subroutine,
with the given parameters (if any).
This new syntax follows the pattern of
"$hashref->{FOO}" and "$aryref->[$foo]": You may now
write "&$subref($foo)" as "$subref->($foo)". All
these arrow terms may be chained; thus,
"&{$table->{FOO}}($bar)" may now be written
"$table->{FOO}->($bar)".
so the $anon->() syntax as been around since then.
Apparently, unlike with named subs, both &$anon()
and $anon->() ignore prototypes. However, like named
subs &$anon gets the caller's @_. But that is almost
never mentioned afaict at the places in the docs where
the &$anon style call is used.
This isn't intended to be a criticism; I just wonder if some
small number of newcomers reading the docs might
be picking up calling habits from this.
--
Brad
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/