That happens because your second capture, held in
$2, is "123" so in your substitution inside the
if $2 is interpolated to give
s/123/something/, which runs quite happily and replaces the first occurence of "123" in
$string. Had your string been "987 123 345" your code would have given the result you wanted but only as a side effect of your error. You could do it like this (not tested)
use strict;
use warnings;
my $string = q{123 123 345};
if ( $string =~
s{^(\d+\s+)(?:\d+)(\s+\d+)}{$1something$2} )
{
print qq{Succeeded\n$string\n};
}
else
{
print qq{Failed\n$string\n};
}
I hope this makes things a bit clearer.
Cheers,
JohnGG