This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Deprecate all length-1 non-graphic variable names
authorKarl Williamson <khw@cpan.org>
Sun, 19 Oct 2014 16:35:04 +0000 (10:35 -0600)
committerKarl Williamson <khw@cpan.org>
Tue, 21 Oct 2014 15:26:51 +0000 (09:26 -0600)
v5.20 deprecated all otherwise-legal control characters as length-1
variable names.  This extends this to include all non-graphic
characters.  The practical effect of this occurs only when not under
"use utf8", and affects just the C1 controls (code points 0x80
through 0xFF), NO-BREAK SPACE, and SOFT HYPHEN.

pod/perldelta.pod
pod/perldiag.pod
t/uni/variables.t
toke.c

index 2c611ca..37aca05 100644 (file)
@@ -78,6 +78,17 @@ as an updated module in the L</Modules and Pragmata> section.
 
 [ List each other deprecation as a =head2 entry ]
 
+=head2 Use of non-graphic characters in single-character variable names
+
+The syntax for single-character variable names is more lenient than
+for longer variable names, allowing the one-character name to be a
+punctuation character or even invisible (a non-graphic).  Perl v5.20
+deprecated the ASCII-range controls as such a name.  Now, all
+non-graphic characters that formerly were allowed are deprecated.
+The practical effect of this occurs only when not under C<S<"use
+utf8">>, and affects just the C1 controls (code points 0x80 through
+0xFF), NO-BREAK SPACE, and SOFT HYPHEN.
+
 =head1 Performance Enhancements
 
 XXX Changes which enhance performance without changing behaviour go here.
@@ -192,7 +203,7 @@ XXX L<message|perldiag/"message">
 
 =item *
 
-XXX L<message|perldiag/"message">
+L<Use of literal non-graphic characters in variable names is deprecated|perldiag/"Use of literal non-graphic characters in variable names is deprecated">
 
 =back
 
index cea0040..fbfdb93 100644 (file)
@@ -6532,10 +6532,19 @@ old way has bad side effects.
 
 =item Use of literal control characters in variable names is deprecated
 
-(D deprecated) Using literal control characters in the source to refer
-to the ^FOO variables, like C<$^X> and C<${^GLOBAL_PHASE}> is now
-deprecated.  This only affects code like C<$\cT>, where \cT is a control in
-the source code: C<${"\cT"}> and C<$^T> remain valid.
+=item Use of literal non-graphic characters in variable names is deprecated
+
+(D deprecated) Using literal non-graphic (including control) characters
+in the source to refer to the ^FOO variables, like C<$^X> and
+C<${^GLOBAL_PHASE}> is now deprecated.  (We use C<^X> and C<^G> here for
+legibility.  They actually represent the non-printable control
+characters, code points 0x18 and 0x07, respectively; C<^A> would mean
+the control character whose code point is 0x01.) This only affects code
+like
+C<$\cT>, where C<\cT> is a control in the source code; C<${"\cT"}> and
+C<$^T> remain valid.  Things that are non-controls and also not graphic
+are NO-BREAK SPACE and SOFT HYPHEN, which were previously only allowed
+for historical reasons.
 
 =item Use of -l on filehandle%s
 
index 69599ad..cea9352 100644 (file)
@@ -105,14 +105,24 @@ for ( 0x0 .. 0xff ) {
             $deprecated = 1;
         }
     }
-    elsif ($chr =~ /[[:cntrl:]]/u) {
-        $name = sprintf "\\x%02x, a C1 control", $ord;
+    elsif ($chr =~ /\pC/) {
+        if ($chr eq "\N{SHY}") {
+            $name = sprintf "\\x%02x, SHY", $ord;
+        }
+        else {
+            $name = sprintf "\\x%02x, a C1 control", $ord;
+        }
+        $deprecated = 1;
     }
     elsif ($chr =~ /\p{XIDStart}/) {
         $name = sprintf "\\x%02x, a non-ASCII XIDS character", $ord;
     }
+    elsif ($chr =~ /\p{XPosixSpace}/) {
+        $name = sprintf "\\x%02x, a non-ASCII space character", $ord;
+        $deprecated = 1;
+    }
     else {
-        $name = sprintf "\\x%02x, a non-ASCII, non-XIDS character", $ord;
+        $name = sprintf "\\x%02x, a non-ASCII, non-XIDS graphic character", $ord;
     }
     no warnings 'closure';
     my $esc = sprintf("%X", $ord);
diff --git a/toke.c b/toke.c
index 41f3ce9..51075e5 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -8572,8 +8572,22 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
                           : 1)
         && VALID_LEN_ONE_IDENT(s, is_utf8))
     {
-        if ( isCNTRL_A((U8)*s) ) {
-            deprecate("literal control characters in variable names");
+        /* Deprecate all non-graphic characters.  Include SHY as a non-graphic,
+         * because often it has no graphic representation.  (We can't get to
+         * here with SHY when 'is_utf8' is true, so no need to include a UTF-8
+         * test for it.) */
+        if ((is_utf8)
+            ? ! isGRAPH_utf8( (U8*) s)
+            : (! isGRAPH_L1( (U8) *s)
+               || UNLIKELY((U8) *(s) == LATIN1_TO_NATIVE(0xAD))))
+        {
+            /* Split messages for back compat */
+            if (isCNTRL_A( (U8) *s)) {
+                deprecate("literal control characters in variable names");
+            }
+            else {
+                deprecate("literal non-graphic characters in variable names");
+            }
         }
         
         if (is_utf8) {