Answers to Chapter 9 Exercises
Here’s one way to do it:
/($what){3}/Once
$whathas 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 one and only command-line parameter, and complaining if it didn’t get it. Then it copies that to
$outand does a substitution to change the file extension, if any, to.out. (It would be sufficient, though, to merely append.outto the filename.)Once the filehandles
INandOUTare opened, the real program can begin. If you didn’t use both options/gand/i, take off half a point, since everyfredand everyFredshould be changed.Here’s one way to do it:
while (<IN>) { chomp; s/Fred/\n/gi; # Replace all FREDs s/Wilma/Fred/gi; # Replace all WILMAs s/\n/Wilma/g; # Replace the placeholder print OUT "$_\n"; }This replaces the loop from the previous program, of course. To do this kind of a swap, we need to have some “placeholder” string, which doesn’t otherwise appear in the data. By using
chomp(and adding the newline back for the output) we ensure that a newline ...