См. perldoc perlvar :
use strict; use warnings;
use Test::More tests => 5;
my %src = (
q{'I want to' 'extract the word' 'PERL','from this string'}
=> q{'I want to' 'extract the word' 'Perl','from this string'},
q{'What about', 'getting','PERL','from','here','?'}
=> q{'What about', 'getting','Perl','from','here','?'},
q{'How can I','use' 'PERL','to process this' 'line'}
=> q{'How can I','use' 'Perl','to process this' 'line'},
q{Invalid} => q{Invalid},
q{'Another invalid string'} => q{'Another invalid string'}
);
while ( my ($src, $target) = each %src ) {
ok($target eq subst_n($src, 3, 'Perl'), $src)
}
sub subst_n {
my ($src, $index, $replacement) = @_;
return $src unless $index > 0;
while ( $src =~ /'.*?'/g ) {
-- $index or return join(q{'},
substr($src, 0, $-[0]),
$replacement,
substr($src, $+[0])
);
}
return $src;
}
Выход:
C:\Temp> pw
1..5
ok 1 - 'Another invalid string'
ok 2 - 'How can I','use' 'PERL','to process this' 'line'
ok 3 - Invalid
ok 4 - 'What about', 'getting','PERL','from','here','?'
ok 5 - 'I want to' 'extract the word' 'PERL','from this string'
Конечно, вам нужно решить, что произойдет, если будет передан недействительный $index
или если требуемое совпадение не найдено. Я просто возвращаю исходную строку в коде выше.