Categories
Posts in this category
- Introduction
- Strings, Arrays, Hashes;
- Types
- Basic Control Structures
- Subroutines and Signatures
- Objects and Classes
- Contexts
- Regexes (also called "rules")
- Junctions
- Comparing and Matching
- Containers and Values
- Where we are now - an update
- Changes to Perl 5 Operators
- Laziness
- Custom Operators
- The MAIN sub
- Twigils
- Enums
- Unicode
- Scoping
- Regexes strike back
- A grammar for (pseudo) XML
- Subset Types
- The State of the implementations
- Quoting and Parsing
- The Reduction Meta Operator
- The Cross Meta Operator
- Exceptions and control exceptions
- Common Perl 6 data processing idioms
- Currying
Tue, 09 Dec 2008
Quoting and Parsing
Permanent link
NAME
"Perl 5 to 6" Lesson 23 - Quoting and Parsing
SYNOPSIS
my @animals = <dog cat tiger> # or my @animals = qw/dog cat tiger/; # or my $interface = q{eth0}; my $ips = q :s :x /ifconfig $interface/; # ----------- sub if { warn "if() calls a sub\n"; } if();
DESCRIPTION
Quoting
Perl 6 has a powerful mechanism of quoting strings, you have exact control over what features you want in your string.
Perl 5 had single quotes, double quotes and qw(...)
(single quotes, splitted on whitespaces) as well as the q(..)
and qq(...)
forms which are basically synonyms for single and double quotes.
Perl 6 in turn defines a quote operator named Q
that can take various modifiers. The :b
(backslash) modifier allows interpolation of backslash escape sequences like \n
, the :s
modifier allows interpolation of scalar variables, :c
allows the interpolation of closures ("1 + 2 = { 1 + 2 }"
) and so on, :w
splits on words as qw/.../
does.
You can arbitrarily combine those modifiers. For example you might wish a form of qw/../
that interpolates only scalars, but nothing else? No problem:
my $stuff = "honey"; my @list = Q :w :s/milk toast $stuff with\tfunny\nescapes/; say @list[*-1]; # with\nfunny\nescapes
Here's a list of what modifiers are available, mostly stolen from S02 directly. All of these also have long names, which I omitted here.
Features: :q Interpolate \\, \q and \' :b Other backslash escape sequences like \n, \t Operations: :x Execute as shell command, return result :w Split on whitespaces :ww Split on whitespaces, with quote protection Variable interpolation :s Interpolate scalars ($stuff) :a Interpolate arrays (@stuff[]) :h Interpolate hashes (%stuff{}) :f Interpolate functions (&stuff()) Other :c Interpolate closures ({code}) :qq Interpolate with :s, :a, :h, :f, :c, :b :regex parse as regex
There are some short forms which make life easier for you:
q Q:q qq Q:qq m Q:regex
You can also omit the first colon :
if the quoting symbol is a short form, and write it as a singe word:
symbol short for qw q:w Qw Q:w qx q:x Qc Q:c # and so on.
However there is one form that does not work, and some Perl 5 programmers will miss it: you can't write qw(...)
with the round parenthesis in Perl 6. It is interpreted as a call to sub qw
.
Parsing
This is where parsing comes into play: Every construct of the form identifier(...)
is parsed as sub call. Yes, every.
if($x<3)
is parsed as a call to sub if
. You can disambiguate with whitespace:
if ($x < 3) { say '<3' }
Or just omit the parens altogether:
if $x < 3 { say '<3' }
This implies that Perl 6 has no keywords. Actually there are keywords like use
or if
, but they are not reserved in the sense that identifiers are restricted to non-keywords.
MOTIVATION
Various combinations of the quoting modifiers are already used internally, for example q:w
to parse <...>
, and :regex
for m/.../
. It makes sense to expose these also to the user, who gains flexibility, and can very easily write macros that provide a shortcut for the exact quoting semantics he wants.
And when you limit the specialty of keywords, you have far less troubles with backwards compatibility if you want to change what you consider a "keyword".