tags:

views:

4396

answers:

8

What does $1 mean in Perl? Further, what does $2 mean? How many $number variables are there?

+16  A: 

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.

Jim Puls
If $1 through $9 are always there, what is there value if there were less than nine matches?
BlueWaldo
$1 through $9 are not always there. I think Jim misread the man page. I am quoting the relevant section: "You may have as many parentheses as you wish. If you have more than 9 substrings, the variables $10, $11, ... refer to the corresponding substring. Within the pattern, \10, \11, etc. refer back to substrings if there have been at least that many left parentheses before the backreference. Otherwise (for backward compatibility) \10 is the same as \010, a backspace, and \11 the same as \011, a tab. And so on. (\1 through \9 are always backreferences.)"
Alan Haggai Alavi
-1 for too many half-truths. They're the result of captures, not the match as a whole. They're only set on successful matches, which means you need to check whether or not the match was successful before using them. As Alan already pointed out, you've confused the special case behavior of the alternate backslash notation.
Michael Carman
I've completely replaced the answer with only the truth. Almost everything in the original answer was wrong.
brian d foy
+8  A: 

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".

rlbond
Captures, not groupings.
Michael Carman
+4  A: 

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)

John T
A: 

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.

+3  A: 

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

Einstein
+6  A: 

$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";
plusplus
A: 

I would suspect that there can be as many as 2**32 -1 numbered match variables, on a 32bit compiled Perl binary.

Brad Gilbert
+1  A: 

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.

benrifkah