my $str = 'Fsih my test variable is fsihd or is it gfsih or gfsih
+d fsih';
# 1111 2222 3333
+ 4444
my $substr = 'fsih';
my $regexp = qr/\Q$substr\E/;
my $replace = 'fish';
my $instance = 3; # 3rd
print("$str\n");
my $pre_count = $instance - 1;
$str =~ s/((?:$regexp.*?){$pre_count})$regexp/$1$replace/;
print("$str\n");
You might have noticed both of these are case sensitive. Both can be made case-insensitive. The non-regexp version is most likely much faster. The regexp version can handle regexps instead of constant strings.