This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove support for ?PATTERN? without explicit 'm' operator
authorDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Wed, 1 Jan 2014 02:41:25 +0000 (03:41 +0100)
committerMatthew Horsfall (alh) <wolfsage@gmail.com>
Tue, 17 Jun 2014 11:59:46 +0000 (07:59 -0400)
This has issued a deprecation warning since v5.14 (commit 725a61d70),
and precludes using ? as an operator after a unary operator that
defaults to $_, such as:

   ref ? $_ : [$_]

pod/perldelta.pod
pod/perldiag.pod
t/lib/warnings/toke
toke.c

index d7374ad..5639dd9 100644 (file)
@@ -158,6 +158,14 @@ Perl 5 to Perl 6 would have been easier.
 This build-time configuration option had been unmaintained for years,
 and had probably seriously diverged on both Perl 5 and Perl 6 sides.
 
+=head2 Support for C<?PATTERN?> without explicit operator has been removed
+
+Starting regular expressions matching only once directly with the
+question mark delimiter is now a syntax error, so that the question mark
+can be available for use in new operators.  Write C<m?PATTERN?> instead,
+explicitly using the C<m> operator: the question mark delimiter still
+invokes match-once behaviour.
+
 =head1 Deprecations
 
 XXX Any deprecated features, syntax, modules etc. should be listed here.
index 19e44e0..f5b93b5 100644 (file)
@@ -6367,15 +6367,6 @@ no way to tie the scalar itself when it held a typeglob, and no way to
 untie a scalar that had had a typeglob assigned to it.  If you see this
 message, you must be using an older version.
 
-=item Use of ?PATTERN? without explicit operator is deprecated
-
-(D deprecated) You have written something like C<?\w?>, for a regular
-expression that matches only once.  Starting this term directly with
-the question mark delimiter is now deprecated, so that the question mark
-will be available for use in new operators in the future.  Write C<m?\w?>
-instead, explicitly using the C<m> operator: the question mark delimiter
-still invokes match-once behaviour.
-
 =item Use of reference "%s" as array index
 
 (W misc) You tried to use a reference as an array index; this probably
index f2a2184..fa9cb73 100644 (file)
@@ -1229,7 +1229,6 @@ $_ = $a = 1;
 $a !=~  /1/;
 $a !=~ m#1#;
 $a !=~/1/;
-$a !=~ ?/?;
 $a !=~ y/1//;
 $a !=~ tr/1//;
 $a !=~ s/1//;
@@ -1238,7 +1237,6 @@ no warnings "syntax";
 $a !=~  /1/;
 $a !=~ m#1#;
 $a !=~/1/;
-$a !=~ ?/?;
 $a !=~ y/1//;
 $a !=~ tr/1//;
 $a !=~ s/1//;
@@ -1249,7 +1247,6 @@ EXPECT
 !=~ should be !~ at - line 7.
 !=~ should be !~ at - line 8.
 !=~ should be !~ at - line 9.
-!=~ should be !~ at - line 10.
 ########
 # toke.c
 our $foo :unique;
@@ -1351,13 +1348,17 @@ Non-octal character '8'.  Resolved as "\o{123}" at - line 3.
 ########
 # toke.c
 use warnings;
-my $a = "foo";
-print $a =~ ?f? ? "yes\n" : "no\n" foreach 0..2;
+print ref ? "yes\n" : "no\n" foreach [], ''; # ? is unambiguosly an operator
 EXPECT
-Use of ?PATTERN? without explicit operator is deprecated at - line 4.
 yes
 no
-no
+########
+# toke .c
+use warnings;
+$a =~ ?rand?; # ? is not a regex match
+EXPECT
+syntax error at - line 3, near "=~ ?"
+Execution of - aborted due to compilation errors.
 ########
 # toke.c
 use warnings;
diff --git a/toke.c b/toke.c
index 877bf40..bf00793 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -6049,62 +6049,43 @@ Perl_yylex(pTHX)
        TERM('@');
 
      case '/':                 /* may be division, defined-or, or pattern */
-       if (PL_expect == XTERMORDORDOR && s[1] == '/') {
+       if ((PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR) && s[1] == '/') {
            if (!PL_lex_allbrackets && PL_lex_fakeeof >=
                    (s[2] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC))
                TOKEN(0);
            s += 2;
            AOPERATOR(DORDOR);
        }
-       /* FALLTHROUGH */
-     case '?':                 /* may either be conditional or pattern */
-       if (PL_expect == XOPERATOR) {
-            char tmp = *s++;
-            if(tmp == '?') {
-               if (!PL_lex_allbrackets &&
-                       PL_lex_fakeeof >= LEX_FAKEEOF_IFELSE) {
-                   s--;
-                   TOKEN(0);
-               }
-               PL_lex_allbrackets++;
-               OPERATOR('?');
-            }
-             else {
-                tmp = *s++;
-                if(tmp == '/') {
-                    /* A // operator. */
-                   if (!PL_lex_allbrackets && PL_lex_fakeeof >=
-                           (*s == '=' ? LEX_FAKEEOF_ASSIGN :
-                                           LEX_FAKEEOF_LOGIC)) {
-                       s -= 2;
-                       TOKEN(0);
-                   }
-                   AOPERATOR(DORDOR);
-                }
-                else {
-                    s--;
-                    if (*s == '=' && !PL_lex_allbrackets &&
-                            PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
-                        s--;
-                        TOKEN(0);
-                    }
-                    Mop(OP_DIVIDE);
-                }
-            }
-        }
-        else {
-            /* Disable warning on "study /blah/" */
-            if (PL_oldoldbufptr == PL_last_uni
-             && (*PL_last_uni != 's' || s - PL_last_uni < 5
-                 || memNE(PL_last_uni, "study", 5)
-                 || isWORDCHAR_lazy_if(PL_last_uni+5,UTF)
-             ))
-                check_uni();
-            if (*s == '?')
-                deprecate("?PATTERN? without explicit operator");
-            s = scan_pat(s,OP_MATCH);
-            TERM(sublex_start());
-        }
+       else if (PL_expect == XOPERATOR) {
+           s++;
+           if (*s == '=' && !PL_lex_allbrackets &&
+               PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) {
+               s--;
+               TOKEN(0);
+           }
+           Mop(OP_DIVIDE);
+        }
+       else {
+           /* Disable warning on "study /blah/" */
+           if (PL_oldoldbufptr == PL_last_uni
+            && (*PL_last_uni != 's' || s - PL_last_uni < 5
+                || memNE(PL_last_uni, "study", 5)
+                || isWORDCHAR_lazy_if(PL_last_uni+5,UTF)
+            ))
+               check_uni();
+           s = scan_pat(s,OP_MATCH);
+           TERM(sublex_start());
+       }
+
+     case '?':                 /* conditional */
+       s++;
+       if (!PL_lex_allbrackets &&
+           PL_lex_fakeeof >= LEX_FAKEEOF_IFELSE) {
+           s--;
+           TOKEN(0);
+       }
+       PL_lex_allbrackets++;
+       OPERATOR('?');
 
     case '.':
        if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack