What does $1 mean in Perl? Further, what does $2 mean? How many $number variables are there?
The number variables are the matches from the last successful match or substitution operator you applied:
my $string = 'abcdefghi';
if( $string =~ /(abc)def(ghi)/ ) {
print "I found $1 and $2\n";
}
Always test that the match or substitution was successful before using $1 and so on. Otherwise, you might pick up the leftovers from another operation.
Perl regular expressions are documented in perlre.
The $number
variables contain the parts of the string that matched the capturing groups in the pattern for your last regex match if the match was successful.
For example, take the following string:
$text = "the quick brown fox jumps over the lazy dog.";
After the statement
$text =~ m/ (b.+?) /;
$1
equals the text "brown
".
These are called "Match Variables". As previously mentioned they contain the text from your last regular expression match.
More information here: http://cslibrary.stanford.edu/108/EssentialPerl.html
(CTRL-F for 'Match Variables' to find corresponding section)
The variables $1 .. $9 are also read only variables so you can't implicitly assign a value to them:
$1 = 'foo'; print $1;
That will return an error: Modification of a read-only value attempted at script line 1.
You also can't use numbers for the beginning of variable names:
$1foo = 'foo'; print $1foo;
The above will also return an error.
As others have pointed out the $x are capture variables for regular expressions allowing you to reference sections of a matched pattern.
Perl also supports named captures which might be easier for humans to remember in some cases.
given input: 111 222
/(\d+)\s+(\d+)/
$1 is 111
$2 is 222
One could also say:
/(?<myvara>\d+)\s+(?<myvarb>\d+)/
$+{myvara} is 111
$+{myvarb} is 222
$1, $2, etc will contain the value of captures from the last successful match - it's important to check whether the match succeeded before accessing them, i.e.
if ( $var =~ m/( )/ ) { # use $1 etc... }
An example of the problem - $1 contains 'Quick' in both print statements below:
#!/usr/bin/perl
'Quick brown fox' =~ m{ ( quick ) }ix;
print "Found: $1\n";
'Lazy dog' =~ m{ ( quick ) }ix;
print "Found: $1\n";
I would suspect that there can be as many as 2**32 -1
numbered match variables, on a 32bit compiled Perl binary.
In general questions regarding "magic" variables in Perl can be answered by looking in the Perl predefined variables documentation a la:
perldoc perlvar
However, when you search this documentation for $1 etc. You'll find references in a number of places except the section on these "digit" variables. You have to search for
$<digits>
I would have added this to Brian's answer either by commenting or editing but I don't have enough rep. If someone adds this I'll remove this answer.