Here's one way to do it:
/($what){3}/
Once $what has been interpolated, this gives a pattern resembling /(fred|barney){3}/. Without the parentheses, the pattern would be something like /fred|barney{3}/, which is the same as /fred|barneyyy/. So, the parentheses are required.
Here's one way to do it:
my $in = $ARGV[0];
unless (defined $in) {
die "Usage: $0 filename";
}
my $out = $in;
$out =~ s/(\.\w+)?$/.out/;
unless (open IN, "<$in") {
die "Can't open '$in': $!";
}
unless (open OUT, ">$out") {
die "Can't write '$out': $!";
}
while (<IN>) {
s/Fred/Larry/gi;
print OUT $_;
}
This program begins by naming its only command-line parameter and complaining if it didn't get it. It copies that to $out and does a substitution to change the file extension, if any, to .out. (It would be sufficient to append .out to the filename.)
Once the filehandles IN and OUT are opened, the real program can begin. If you didn't use the /g and /i options, take off half a point since every fred and every Fred should be changed.