Apocalypse 5
by Larry Wall
|
Pages: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
Editor's Note: this Apocalypse is out of date and remains here for historic reasons. See Synopsis 05 for the latest information.
It's also possible to refer to captures relative to the current
location. $-1 refers to the immediately preceding capture (what
used to be known as $+). $-2 refers to the one before that.
If you use anything above $-3 we'll come and take you away to the
insane asylum.
Subrules called via <rule> also capture their result in
hypothetical variables. It's possible to name the results of any
<...>, but grammar rules already have a name by default, so
you don't have to give them names unless you call the same rule more
than once. So, presuming you have grammar rules defining "key" and
"value", you can say:
/ <key> \: <value> { let %hash{$key} = $value } /
Of course, in a typical grammar the typical rule may not return a string, but a reference to an anonymous object representing a node of the parse tree. But that depends on what the subrule decides to capture. If the only thing captured in the subrule is a single string, that's what you get. (If nothing is captured, you get the entire match.)
Any capture that will capture multiple items will, if asked to put it into a scalar variable, produce an anonymous list automatically. This should rarely be a surprise, since it's obvious by inspection whether you've quantified the capture or not. So if you say any of:
/ $x := <word>*/
/ $x := <word>+/
/ $x := <word><1,3>/
then you've "pluralized" the naming, and you can expect to get some
number of values in $x as an anonymous list. However, the ?
quantifier specifically doesn't pluralize. If you say:
/ $x := <word>?/
then $x will either be the result of the subrule or undef.
You can name the results of a zero-width assertion, but you'd typically only get the null string out of it. This can still be useful, since it contrasts with the undefined value you'd have if the assertion fails. (It is possible with an explicit capture to return a non-zero-width string from a zero-width assertion, however.)
Variable Scoping
When you refer to a variable @foo as an rvalue in a regex, it
searches for an existing variable in the following places:
-
We first look to see if the variable is already declared lexically
with either
my @fooorour @foo. If so declared, we're done. -
Next we look for
@fooin the current regex's name table. The name of the variable is really$0{'@foo'}. -
If the regex belongs to a grammar, we next look for
@fooin the grammar object. If there, its real name is@.foo, or some such. (It might be objected that the grammar object is not yet constructed when the regex is compiled. After all, the regex is probably being passed to the grammar object's constructor. But I think if such a variable is declared as an object attribute we know that there will be such a variable/accessor later when we have finished constructing, and that seems like enough info to know how to compile the regex.) -
Next we look for
@fooas a declared core global variable@*foo. -
Finally, if "strict vars" is not in effect, we assume that
@foois stored in the current package. Otherwise it's a stricture error.
Pages: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 |

