Re: Why are subs matching /^[\W_]$/ global?

[email protected] (Ævar Arnfjörð Bjarmason)
Newsgroups perl.perl5.porters
Message-ID <[email protected]>
On Wed, Jun 2, 2010 at 14:18, Abigail <[email protected]> wrote:
> On Wed, Jun 02, 2010 at 02:03:26PM +0000, Ævar Arnfjörð Bjarmason wrote:
>> On Wed, Jun 2, 2010 at 13:13, Abigail <[email protected]> wrote:
>> > On Wed, Jun 02, 2010 at 12:46:44PM +0000, Ęvar Arnfjörš Bjarmason wrote:
>> >> Single-character non-alpha (plus _) subroutines are global
>> >>
>> >>     $ perl -le '** = sub {warn "Hi"}; package Foo; &*'
>> >>     Hi at -e line 1.
>> >>
>> >>     $ perl -le '*a = sub {warn "Hi"}; package Foo; &a'
>> >>     Undefined subroutine &Foo::a called at -e line 1.
>> >>
>> >> and:
>> >>
>> >>     $ perl -le '*_ = sub {warn "Hi"}; package Foo; &_'
>> >>     Hi at -e line 1.
>> >>
>> >>     $ perl -le '*__ = sub {warn "Hi"}; package Foo; &__'
>> >>     Undefined subroutine &Foo::__ called at -e line 1
>> >>
>> >> This came up when I was looking at _() in Perl as a potential Gettext
>> >> wrapper (I know about the _ filehandle).
>> >>
>> >> _ I think I can understand (presumably the _ glob is global). But why
>> >> does this apply generally to all /^[\W_]$/ subs? Is it explicitly
>> >> documented somewhere? Perhaps it's something we'd want to deprecate?
>> >>
>> >
>> >
>> > Documented. From perlvar:
>> >
>> >       Perl identifiers that begin with digits, control characters, or
>> >       punctuation characters are exempt from the effects of the "package"
>> >       declaration and are always forced to be in package "main"; they are
>> >       also exempt from "strict 'vars'" errors.  A few other names are also
>> >       exempt in these ways:
>> >
>> >               ENV             STDIN
>> >               INC             STDOUT
>> >               ARGV            STDERR
>> >               ARGVOUT         _
>> >               SIG
>> >
>> >       In particular, the new special "${^_XYZ}" variables are always taken to
>> >       be in package "main", regardless of any "package" declarations
>> >       presently in scope.
>> >
>> >
>> > Note also that perlvar claims all such names are reserved for special uses
>> > by Perl. From the same manual page:
>>
>> Thanks. I was looking in perlsub and friends.
>>
>> >       Perl variable names may also be a sequence of digits or a single
>> >       punctuation or control character.  These names are all reserved for
>> >       special uses by Perl; for example, the all-digits names are used to
>> >       hold data captured by backreferences after a regular expression match.
>> >       Perl has a special syntax for the single-control-character names: It
>> >       understands "^X" (caret "X") to mean the control-"X" character.  For
>> >       example, the notation $^W (dollar-sign caret "W") is the scalar
>> >       variable whose name is the single character control-"W".  This is
>> >       better than typing a literal control-"W" into your program.
>> >
>> >
>> > Basically, it comes down to, "if it global, you can't have it anyway".
>>
>> Right, but if it's reserved by perl, perhaps we should warn and
>> eventually prohibit uses of these constructs. As-is you can define and
>> use a sub called *, even though it's reserved.
>
>
> Why? It has worked for over a dozen years or so. So what if someone
> defines a sub &,. I don't see p5p making &, a core function anytime soon.
>
> It might have been something to prohibit when 5.000 was developed, but
> I don't see any benefits to warn, and later prohibit this now.

To reduce the mismatch between what the POD claims, and what the
implementation actually does. That there isn't even a warning when you
use something that's "reserved for special uses by Perl" seems like an
implementation omission.

It'd also be friendly if this:

    package Meh;
    use warnings 'danger_will_robinson';
    sub x {}
    sub _ {}

Noted to the naïve user that Perl's magically using odd scope
semantics for "_" that don't apply to "x". That's the reason I ran
into this.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.