What does $1 mean in Perl?

RegexPerl

Regex Problem Overview


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

Regex Solutions


Solution 1 - Regex

The $number variables contain the parts of the string that matched the capture 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".

Solution 2 - Regex

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.

Solution 3 - Regex

$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";

Solution 4 - Regex

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

Solution 5 - Regex

These are called "match variables". As previously mentioned they contain the text from your last regular expression match.

More information is in Essential Perl. (Ctrl + F for 'Match Variables' to find the corresponding section.)

Solution 6 - Regex

Since you asked about the capture groups, you might want to know about $+ too... Pretty useful...

use Data::Dumper;
$text = "hiabc ihabc ads byexx eybxx";
while ($text =~ /(hi|ih)abc|(bye|eyb)xx/igs)
{
    print Dumper $+;
}

> OUTPUT:
>$VAR1 = 'hi';
>$VAR1 = 'ih';
>$VAR1 = 'bye';
$VAR1 = 'eyb';

Solution 7 - Regex

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.

Solution 8 - Regex

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChad DeShonView Question on Stackoverflow
Solution 1 - RegexrlbondView Answer on Stackoverflow
Solution 2 - RegexJim PulsView Answer on Stackoverflow
Solution 3 - RegexplusplusView Answer on Stackoverflow
Solution 4 - RegexEinsteinView Answer on Stackoverflow
Solution 5 - RegexJohn TView Answer on Stackoverflow
Solution 6 - RegexHemanth GowdaView Answer on Stackoverflow
Solution 7 - Regexuser118435View Answer on Stackoverflow
Solution 8 - RegexBrad GilbertView Answer on Stackoverflow