I don't want to join the discussion in general, and I'm not on the
language list.  So this is a one-shot manifesto.

I agree with the goal of RFC17:

        Organization and Rationalization of Perl State Variables

but I think the implementation ideas are making a terrible mistake.
Specifically:

> =head1 IMPLEMENTATION
> =head3 Well-Named Global Hashes And Keys

I think if there's one thing we have learned (or should have leanred)
from Perl 5, it's that this sort of global state variable is a
terrible idea regardless of what its name is.

Why is $* deprecated?  Because it's dangerous.  

Why is $* dangerous?

Because some function eleven calls down in some module you never heard
of that was loaded by some other module might do this:

        $* = 1;

which suddenly changes the semantics of *every* regex match in your
*entire* program.

Conclusion:  The real problem with $* isn't the name (although the
name is nasty.)  The real problem is that it's a global variable with
a global effect, and it changes the meaning of code that is far away.

RFC17 fixes the little problem and leaves the big problem gaping and
festering.

But OK, $* is deprecated, so we can assume that it won't be in Perl 6.
Maybe the real problem has gone away?  No.  RFC17 specifically
mentions $^W, which has exactly the same problem.  Some function
eleven calls down in some module that was loaded by some other module
might do

        $^W = 1;

(or $PERL::CORE{warnings} = 1 if you prefer) and suddenly change the
warning behavior of *every* part of your *entire* program.  If $* were
not a global, it would be at worst an odd wart, and possibly even a
convenience.  Because it is a global, it is a dangerous hazard.  $^W
is similar.

$/ is a necessary evil that must be carefully used because it is a
global.  If you set $/ and forget to localize the change, the rest of
the program blows up in a bizarre way because *every* filehandle read
operation in (every* part of the program changes behavior.  If $/ were
per-filehandle, or if it were lexically scoped, it would be an
unmitigated advantage.

Similarly for each of $\ $, $" $; $# $* $= $^L $^A $@ $^I $^P $^R $^W
and especially the putrid $[.

$| $^ $~ are less problematic because they are per-filehandle.

$. $% $` $& $' $- $+ @+ @- $? $! $^E $$ $[ $^O $^R $^T $^V are less
problematic because they are read-only.  Some, like $., are still
problematic, because, for example:

        $line = <FH>;
        subr();
        print "Line $. is $line";

might work, or it might not.  

$0 $< $> $( $) $^C $^D $^F $^H $^M @ARGV are not problems because they
really are global.  Each process has one real UID, and only one, so a
global variable for $< is perfectly OK.

$_ is in a class by itself.  

Summary of manifesto: Global variables must be expunged.

Replacing the old rotten global variables with new rotten global
variables is not enough of an improvement.



Mark-Jason Dominus                                               [EMAIL PROTECTED]
I am boycotting Amazon. See http://www.plover.com/~mjd/amazon.html for details.

Reply via email to