A couple of weeks ago, we looked at some error messages that Perl 6 generates when it sees the Perl 5 constructions. Let us continue and go through another portion of the messages that are there in today’s Rakudo.
\x[]
We start with a simple error message that informs you to use new syntax when embedding a character by its code. In Perl 5, you could use \x{23} to get a hash characters, while in Perl 6 it is an error:
$ perl6 -e'say "\x{23}"' ===SORRY!=== Error while compiling -e Unsupported use of curlies around escape argument; in Perl 6 please use square brackets at -e:1 ------> say "\x{⏏23}"
Neither it works with regexes, for example:
say "###" ~~ /\x{23}/
Replacing braces with square brackets helps:
$ perl6 -e'say "\x[23]"' #
Similarly, Perl 6 expects the brackets for octal numbers:
$ perl6 -e'say "\o[123]"' S
In the Grammar, this situation is caught by the following tokens.
For quoted strings:
role b1 { token backslash:sym<x> { :dba('hex character') <sym> [ <hexint> | '[' ~ ']' <hexints> | '{' <.obsbrace1> ] } . . . }
For regexes:
token backslash:sym<x> { :i :dba('hex character') <sym> [ <hexint> | '[' ~ ']' <hexints> | '{' <.obsbrace> ] } . . . token metachar:sym<{}> { \\<[xo]>'{' <.obsbrace> }
The obsbrace method itself is just a simple error message call:
token obsbrace { <.obs('curlies around escape argument', 'square brackets')> }
Old regex modifiers
As soon as we are talking about regexes, here’s another set of error catchers complaining about the Perl 5 syntax of the regex modifiers:
token old_rx_mods { (<[ i g s m x c e ]>) { my $m := $/[0].Str; if $m eq 'i' { $/.obs('/i',':i'); } elsif $m eq 'g' { $/.obs('/g',':g'); } elsif $m eq 'm' { $/.obs('/m','^^ and $$ anchors'); } elsif $m eq 's' { $/.obs('/s','. or \N'); } elsif $m eq 'x' { $/.obs('/x','normal default whitespace'); } elsif $m eq 'c' { $/.obs('/c',':c or :p'); } elsif $m eq 'e' { $/.obs('/e','interpolated {...} or s{} = ... form'); } else { $/.obs('suffix regex modifiers','prefix adverbs'); } } }
This code is quite self-explanatory, so a simple example would be enough:
$ ./perl6 -e'"abc" ~~ /a/i' ===SORRY!=== Error while compiling -e Unsupported use of /i; in Perl 6 please use :i at -e:1 ------> "abc" ~~ /a/i⏏<EOL>
One of the following correct forms is expected:
$ ./perl6 -e'say "abc" ~~ m:i/A/' 「a」 $ ./perl6 -e'say "abc" ~~ /[:i A]/' 「a」
As an exercise, write an incorrect Perl 6 code that generates the last error message, Unsupported use of suffix regex modifiers, in Perl 6 please use prefix adverbs.
tr///
Another regex-related construct, y/// does not exist in Perl 6, only the tr/// form is supported now:
token quote:sym<y> { <sym> <?before \h*\W> {} <.qok($/)> <.obs('y///','tr///')> }
Here is an example of the correct program:
my $x = "abc"; $x ~~ tr/b/p/; say $x; # apc
That’s it for today. We will continue with more obsolete errors in a few days.
One thought on “🔬24. Obsolete syntax error messages in Perl 6, part 3”