You are numbering all abc's. There is no need to match surrounding characters. Note that the way I have rewritten your test cases removes all ambiguity concerning white space.
use strict;
use warnings;
use Test::More;
my @cases = (
# Input Expected Description
["int abc;\n", "int abc_1;\n\nint abc_2;\n\n", 'line 1'],
[".abc(abc);\n", ".abc_1(abc_1);\n\n.abc_2(abc_2);\n\n", 'line 2'],
);
plan tests => scalar @cases;
foreach my $case (@cases) {
my $line = $case->[0];
my $out = '';
$out .= ($line =~ s/abc/abc_$_/gr) . "\n" for (1,2);
is( $out, $case->[1], $case->[2] );
}
OUTPUT:
1..2
ok 1 - line 1
ok 2 - line 2