http://www.perlmonks.org?node_id=201734

Helter has asked for the wisdom of the Perl Monks concerning the following question:

I found a solution that works, but to gain more understanding (and I'm stubborn that way) I want to know why my first solution does not work.

I'm parsing a file, looking for a single line to replace 2 characters.
Line in question:
__msr2f6: data8 0b00000000000000000000000000_1_0_000000000000001 +0101_00000000000000000
My initial search/replace was this:
$line =~ s/^(__msr2f6:\s+data8 0b[01]+_)[01]_[01](_[01]+_[01]+)/$10_0$ +2/;
This causes an error to be printed:
Use of uninitialized value in concatenation (.) at myscript.pl line 33 +, <FILE> line 915.
A co-worker suggested a change, but didn't know why it might work:
$line =~ s/^(__msr2f6:\s+data8 0b[01]+)_[01]_[01]_([01]+_[01]+)/$1_0_0 +_$2/;
So I moved the leading and trailing underscore out of the parens and put them in the replace string.

Here are some things I think I understand, but then again maybe not...

1. Backrefrences are 1-9, only a single digit.
2. Underscores are valid variable name components.

So what changes between these two examples? If the first variable is being treated as $10_0, then why is the second not being treated as $1_0_0_?

This solution also works:
$line =~ s/^(__msr2f6:\s+data8 0b[01]+_)[01]_[01](_[01]+_[01]+)/$1."0_ +0".$2/e;
But it is probably slower than the other working solution.

Thanks for the enlightenment!