Answers to Chapter 9 Exercises
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
andOUT
are opened, the real program can begin. If you didn’t use the/g
and/i
options, take off half a point since everyfred
and everyFred
should 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. To do this swap, we need to have some “placeholder” string that doesn’t appear in the data. By using
chomp
(and adding the newline back for the output), we ensure that a newline (\n
) can be the placeholder. (You could choose some other ...
Get Learning Perl, Fourth Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.