$text =~ s/\b(?:(Abc)|abc)\b/ $1 ? 'Xyz' : 'xyz' /eg;
Если фактический список длиннее, вы можете использовать справочную таблицу.
my %translations = (
'Abc' => 'Xyz', 'abc' => 'xyz',
'Def' => 'Ghi', 'def' => 'ghi',
'Jkl' => 'Mno', 'jkl' => 'mno',
);
my $alt_pat = join '|', map quotemeta, keys(%translations);
$text =~ s/\b($alt_pat)\b/$translations{$1}/g;
Но это все еще оставляет некоторое дублирование, которое можно удалить, выводя строчные версии.
my %translations = (
'Abc' => 'Xyz',
'Def' => 'Ghi',
'Jkl' => 'Mno',
);
%translations = ( ( map lc, %translations ), %translations );
my $alt_pat = join '|', map quotemeta, keys(%translations);
$text =~ s/\b($alt_pat)\b/$translations{$1}/g;