See 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; }
Conclusion:
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'
Of course, you need to decide what happens if an invalid $index passed in or if the required match is not found. I just returned the original line to the code above.