princepawn has asked for the wisdom of the Perl Monks concerning the following question:

In this node, japhy does not package qualify a non-lexically scoped variable and yet this code does run under use strict as I have tested it on my machine?

Where is this behavior documented? For reference, here is the line which apparently sneaked by strict:

BEGIN { ${^CMDLINE} = join ' ', $0, @ARGV }

Replies are listed 'Best First'.
Re: How can one bypass use strict?
by John M. Dlugosz (Monsignor) on Aug 13, 2001 at 23:17 UTC
    The special variables that are exempt from package scope are presumably also except from needing scope qualification under strict. They are:

    identifiers that begin with digits, control characters, or punctuation characters,

    ENV STDIN INC STDOUT ARGV STDERR ARGVOUT SIG

    Also, ${^CMDLINE} is reserved. Use ${^_CMDLINE} if you must, but an ordinary variable should do.

    —John

      What do you mean by "${^CMDLINE} is reserved".

      _____________________________________________________
      Jeff[japhy]Pinyan: Perl, regex, and perl hacker.
      s++=END;++y(;-P)}y js++=;shajsj<++y(p-q)}?print:??;

        According to perlvar, "These variables are reserved for future special uses by Perl, except for the ones that begin with ^_ (control-underscore or caret-underscore)."

        A new version of Perl may use a variable name that stomps on your use, if you use a "funny" variable of your own.

Re (tilly) 1: How can one bypass use strict?
by tilly (Archbishop) on Aug 14, 2001 at 01:02 UTC
    According to Dominus it should be documented at the end of perlvar for people using Perl 5.6, which is also when it was implemented.

    For further details and a surprise, see Re: $_ haters anonymou.

Re: How can one bypass use strict?
by mirod (Canon) on Aug 13, 2001 at 23:18 UTC

    ^CMDLINE is a regular (constant) string, use strict refs; would complain only if that string was in a variable:

    my $s= '^CMDLINE'; ${$s} = join ' ', $0, @ARGV

    As it is the ${} is used to give a non_standard name to the variable, but that's OK.

    It is the same as using $var= "use strict "; print "${var}101"; to print use strict 101.

    Update: I apologize, I should stop trying to answer fast and start tinking a little... this is actually quite weird as $^CMDLINE is of course not declared, so strict should complain about it. It looks like if you use a caret then an upper case string (something like ${^T}) then strict let you get away with it. As soon as you don't use the caret or start with a lower case... you die: ${^Ta} is OK but not ${^aT}

      But why complains ${CMDLINE} = 'foo'; then??

      And why does ${^cmdline} = 'foo'; give a syntax error?? There must be some kind of special rules for variables starting with /^\^[A-Z]/,

      -- Hofmator

        Because the form ${^X} must have an uppercase charater there. This comes from toke.c:
        /* In variables name $^X, these are the legal values for X. * 1999-02-27 mjd-perl-patch@plover.com */ #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?",(x)))
        And the ${^Xyzpdq} variables are an extension of those, so claims perlvar:
        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.

        Finally, new in Perl 5.6, Perl variable names may be alphanumeric strings that begin with control characters (or better yet, a caret). These variables must be written in the form `${^Foo}'; the braces are not optional. `${^Foo}' denotes the scalar variable whose name is a control-`F' followed by two `o''s. ...

Re: How can one bypass use strict?
by rucker (Scribe) on Aug 13, 2001 at 23:44 UTC
    Where is japhy's node? The link seems to be broken.

    Update: FWIW, this behaviour seems to be in 5.6 and not 5.005.