in reply to Re^5: why such an error happened?
in thread why such an error happened?

lightoverhead is correct. Perhaps you missed the "g" modifier? There will be three matches.

  1. $1 = substr($chr, 0, 4); $2 = undef;
  2. $1 = undef;              $2 = substr($chr, 5, 3);
  3. $1 = substr($chr, 9, 4); $2 = undef;

Update: I understand your confusion better now. I'll correct what you said:

$1 represents what was matched in the first set of matched parenthesis. $2 represents what was matched in the second set of matched parenthesis.

There's no such thing as "matched parentheses" Either the whole pattern matches or it doesn't.

________ $1 unconditionally refers to this capture / if the match was successful. | | __ $2 unconditionally refers to this capture | / if the match was successful. | | v v /(...)|(...)/

It can easily be demonstrated:

for (qw(a b)) { /(a)|(b)/; print( defined($1) ? $1 : '~', defined($2) ? $2 : '~', "\n" ); }
a~ ~b