Deprecate assignment to $[
Rafael Garcia-Suarez [Tue, 7 Apr 2009 10:31:16 +0000 (12:31 +0200)]
Based on a patch by James Mastros :

Subject: Deprecating $[
Message-ID: <abc933c50904020726x31776ab5m192036429af16f03@mail.gmail.com>

op.c
pod/perldiag.pod
pod/perlvar.pod
t/lib/warnings/op
t/op/each_array.t
t/op/substr.t

diff --git a/op.c b/op.c
index b889319..517f648 100644 (file)
--- a/op.c
+++ b/op.c
@@ -4355,6 +4355,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
            PL_eval_start = 0;
        else {
            if (!PL_madskills) { /* assignment to $[ is ignored when making a mad dump */
+               deprecate("assignment to $[");
                op_free(o);
                o = newSVOP(OP_CONST, 0, newSViv(CopARYBASE_get(&PL_compiling)));
                o->op_private |= OPpCONST_ARYBASE;
index 70a432d..d958262 100644 (file)
@@ -4661,6 +4661,11 @@ you can write it as C<push(@tied_array,())> to avoid this warning.
 (F) The "use" keyword is recognized and executed at compile time, and
 returns no useful value.  See L<perlmod>.
 
+=item Use of assignment to $[ is deprecated
+
+(D deprecated) The C<$[> variable (index of the first element in an array)
+is deprecated. See L<perlvar/"$[">.
+
 =item Use of bare << to mean <<"" is deprecated
 
 (D deprecated, W syntax) You are now encouraged to use the explicitly quoted
index 914eebe..7c61a05 100644 (file)
@@ -1037,8 +1037,9 @@ subscripting and when evaluating the index() and substr() functions.
 
 As of release 5 of Perl, assignment to C<$[> is treated as a compiler
 directive, and cannot influence the behavior of any other file.
-(That's why you can only assign compile-time constants to it.)
-Its use is highly discouraged.
+(That's why you can only assign compile-time constants to it.)  Its
+use is deprecated, and will trigger a warning (if the deprecation
+L<warnings> category is enabled.  You did C<use warnings>, right?)
 
 Note that, unlike other compile-time directives (such as L<strict>),
 assignment to C<$[> can be seen from outer lexical scopes in the same file.
index cc968c7..64217c7 100644 (file)
@@ -1094,3 +1094,12 @@ Deprecated use of my() in false conditional at - line 6.
 Deprecated use of my() in false conditional at - line 7.
 Deprecated use of my() in false conditional at - line 8.
 Deprecated use of my() in false conditional at - line 9.
+########
+# op.c
+$[ = 1;
+use warnings 'deprecated';
+$[ = 2;
+no warnings 'deprecated';
+$[ = 3;
+EXPECT
+Use of assignment to $[ is deprecated at - line 4.
index b0665e1..2389473 100644 (file)
@@ -1,4 +1,4 @@
-#!./perl -w
+#!./perl
 
 BEGIN {
     chdir 't' if -d 't';
@@ -6,6 +6,8 @@ BEGIN {
     require './test.pl';
 }
 use strict;
+use warnings;
+no warnings 'deprecated';
 use vars qw(@array @r $k $v);
 
 plan tests => 48;
index 81c87be..c3fa6e1 100755 (executable)
@@ -1,4 +1,4 @@
-#!./perl -w
+#!./perl
 
 #P = start of string  Q = start of substr  R = end of substr  S = end of string
 
@@ -7,6 +7,7 @@ BEGIN {
     @INC = '../lib';
 }
 use warnings ;
+no warnings 'deprecated';
 
 $a = 'abcdefxyz';
 $SIG{__WARN__} = sub {