Answers to Chapter 9 Exercises

  1. 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.

  2. 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.