abe@mace.cc.purdue.edu (Vic Abell) (04/06/91)
The following Perl program:
if ("one two three four\n" =~ /^((\w+\s+){3})/) {
print '"', $1, "\" \"", $2, "\" \"", $3, "\" \"", $4, "\"\n";
} else {
print "No match!\n";
}
produces:
"one two three " "three " "" ""
I expected:
"one two three " "one " "two " "three "
Can anyone help me understand why the "((\w+\s+){3})" matching and
bracketing expression didn't create four special Perl variables?
It appears that only the final match of the thrice-matched inner
part -- "(\w+\s+){3}" -- is being assigned to a special variable.
Vic Abell <abe@mace.cc.purdue.edu>tchrist@convex.COM (Tom Christiansen) (04/06/91)
From the keyboard of abe@mace.cc.purdue.edu (Vic Abell):
:The following Perl program:
:
: if ("one two three four\n" =~ /^((\w+\s+){3})/) {
: print '"', $1, "\" \"", $2, "\" \"", $3, "\" \"", $4, "\"\n";
: } else {
: print "No match!\n";
: }
:
:produces:
:
: "one two three " "three " "" ""
:
:I expected:
:
: "one two three " "one " "two " "three "
:
:Can anyone help me understand why the "((\w+\s+){3})" matching and
:bracketing expression didn't create four special Perl variables?
There are only two (paren-pairs), so you only get two variables.
--tomworley@compass.com (Dale Worley) (04/06/91)
From: abe@mace.cc.purdue.edu (Vic Abell)
Can anyone help me understand why the "((\w+\s+){3})" matching and
bracketing expression didn't create four special Perl variables?
For better or worse, because there are only two sets of parentheses
(lexically speaking), there will only be $1 and $2. Every time the
regexp inside a pair of parentheses matches, its match is loaded into
the appropriate variable. Thus, only the last thing to match a pair
of parentheses is available. For example:
(regexp)* # $1 will be the last match of regexp
Undoing assignments to variables while backtracking is done is a bear,
but I assume that Perl does that correctly.
Dale
Dale Worley Compass, Inc. worley@compass.com
--
We will encourage you to develop the three great virtues of a
programmer: laziness, impatience, and hubris.
-- Larry Wall and Randall Schwartz in "Programming Perl"