This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #117101] toke.c: Make \$$1 work again.
authorBrian Fraser <fraserbn@gmail.com>
Sat, 9 Mar 2013 22:36:34 +0000 (15:36 -0700)
committerKarl Williamson <public@khwilliamson.com>
Sat, 9 Mar 2013 22:45:55 +0000 (15:45 -0700)
Commit 3283393 replaced the use of isWORDCHAR (\p{Word}) in scan_ident
with isIDFIRST (\p{XIDS}). Generally this was not troublesome, since
there are other places that deal with variables matching \d, but
one use of isWORDCHAR had given digit variables an unintended special
case:
$$1 meant ${$1}, whereas $$@ or $$* were syntax errors.

This commit restores the special case for \p{POSIX_Digit} variables.

t/uni/variables.t
toke.c

index 0e810a4..9a469d6 100644 (file)
@@ -12,7 +12,7 @@ use utf8;
 use open qw( :utf8 :std );
 no warnings qw(misc reserved);
 
-plan (tests => 65850);
+plan (tests => 65856);
 
 # ${single:colon} should not be valid syntax
 {
@@ -167,4 +167,37 @@ for my $i (0x100..0xffff) {
            "\\x{$esc} isn't XIDS, illegal as a length-1 variable",
           )
    }
-}
\ No newline at end of file
+}
+
+{
+    # Bleadperl v5.17.9-109-g3283393 breaks ZEFRAM/Module-Runtime-0.013.tar.gz
+    # https://rt.perl.org/rt3/Public/Bug/Display.html?id=117101
+    no strict;
+
+    local $@;
+    eval <<'EOP';
+    q{$} =~ /(.)/;
+    is($$1, $$, q{$$1 parses as ${$1}});
+
+    $doof = "test";
+    $test = "Got here";
+    $::{+$$} = *doof;
+
+    is( $$$$1, $test, q{$$$$1 parses as ${${${$1}}}} );
+EOP
+    is($@, '', q{$$1 parses correctly});
+
+    for my $chr ( q{@}, "\N{U+FF10}", "\N{U+0300}" ) {
+        my $esc = sprintf("\\x{%x}", ord $chr);
+        local $@;
+        eval <<"    EOP";
+            \$$chr = q{\$};
+            \$\$$chr;
+    EOP
+
+        like($@,
+             qr/syntax error|Unrecognized character/,
+             qq{\$\$$esc is a syntax error}
+        );
+    }
+}
diff --git a/toke.c b/toke.c
index 4579e63..332f653 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -9281,7 +9281,11 @@ S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck
        return s;
     }
     if (*s == '$' && s[1] &&
-       (isIDFIRST_lazy_if(s+1,is_utf8) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
+      (isIDFIRST_lazy_if(s+1,is_utf8)
+         || isDIGIT_A((U8)s[1])
+         || s[1] == '$'
+         || s[1] == '{'
+         || strnEQ(s+1,"::",2)) )
     {
        return s;
     }