> Date: Wed, 13 Nov 2002 20:34:49 +0000
> From: Nicholas Clark <[EMAIL PROTECTED]>
> 
> 
> If a subroutine explicitly needs access to its invocant's topic, what is so
> wrong with having an explicit read-write parameter in the argument list that
> the caller of the subroutine is expected to put $_ in?
> 
> It makes it clear.
> 
> If I understand all this correctly, as is, this "access caller's topic"
> is an unrestricted licence to commit action at a distance.
> 
> Accessing the caller's topic is the default in perl5. And there is still a
> steady stream of bugs to p5p where core perl modules are doing something
> (typically a while loop) which tramples on $_, and so makes something go
> wrong in their caller. (possibly several levels down)
> 
> (And for that matter the "obvious" solution of local ($_) in perl5 is also
> action at a distance if $_ is tied, as local is an immediate fetch and a
> store at end of scope. Special case local on $_ ?)

Indeed.  And also mind that many (IIRC all, but I could be wrong)
Perl5 builtins used $_ as the I<default>, and if a parameter was
supplied it would use that.

My favorite was from ages ago:

    sub bar(;$foo //= $_) {...}

'Course that could be mistaken for defaulting to the current $_ in
C<bar>'s lexical scope.  Regardless, IMO it is better style to always
use $_ as just a default, rather than a requirement.  Is there a good
reason to have subs like this:?

    sub bar($foo) is given($baz) {...}

Or, if you stick with Perl5 convention, and I imagine this is what
people will expect from the builtins at least:

    sub bar($foo; $baz) is given($baz) {...}

That duplicated parameter looks strange, and people will be wary of
using it that way (as I was).  I don't know what it looks like, but it
doesn't look like $baz gets $_ if not, well, C<given>.

Luke

Reply via email to