Blame


1 1ddd2d4e 2023-09-10 jrmu #!/usr/bin/perl
2 1ddd2d4e 2023-09-10 jrmu
3 1ddd2d4e 2023-09-10 jrmu # The Professor has to read a logfile that looks like the example we show
4 1ddd2d4e 2023-09-10 jrmu # here. You can get sample data files from the Downloads section of
5 1ddd2d4e 2023-09-10 jrmu # http://www.intermediateperl.com/:
6 1ddd2d4e 2023-09-10 jrmu
7 1ddd2d4e 2023-09-10 jrmu # Gilligan: 1 coconut
8 1ddd2d4e 2023-09-10 jrmu # Skipper: 3 coconuts
9 1ddd2d4e 2023-09-10 jrmu # Gilligan: 1 banana
10 1ddd2d4e 2023-09-10 jrmu # Ginger: 2 papayas
11 1ddd2d4e 2023-09-10 jrmu # Professor: 3 coconuts
12 1ddd2d4e 2023-09-10 jrmu # MaryAnn: 2 papayas
13 1ddd2d4e 2023-09-10 jrmu # ...
14 1ddd2d4e 2023-09-10 jrmu #
15 1ddd2d4e 2023-09-10 jrmu # He wants to write a series of files, called gilligan.info, maryann.info,
16 1ddd2d4e 2023-09-10 jrmu # and so on. Each file should contain all the lines that begin with that
17 1ddd2d4e 2023-09-10 jrmu # name. (Names are always delimited by the trailing colon.) At the end,
18 1ddd2d4e 2023-09-10 jrmu # gilligan.info should start with:
19 1ddd2d4e 2023-09-10 jrmu #
20 1ddd2d4e 2023-09-10 jrmu # Gilligan: 1 coconut
21 1ddd2d4e 2023-09-10 jrmu # Gilligan: 1 banana
22 1ddd2d4e 2023-09-10 jrmu #
23 1ddd2d4e 2023-09-10 jrmu # Now, the logfile is large and the coconut-powered computer is not fast,
24 1ddd2d4e 2023-09-10 jrmu # so he wants to process the input file in one pass and write all output
25 1ddd2d4e 2023-09-10 jrmu # files in parallel. How does he do it?
26 1ddd2d4e 2023-09-10 jrmu #
27 1ddd2d4e 2023-09-10 jrmu # Hint: Use a hash keyed by castaway name and whose values are IO::File
28 1ddd2d4e 2023-09-10 jrmu # objects for each output file. Create those files if they don't exist yet,
29 1ddd2d4e 2023-09-10 jrmu # and overwrite them if they do.
30 1ddd2d4e 2023-09-10 jrmu
31 1ddd2d4e 2023-09-10 jrmu use v5.24;
32 1ddd2d4e 2023-09-10 jrmu use warnings;
33 1ddd2d4e 2023-09-10 jrmu use strict;
34 1ddd2d4e 2023-09-10 jrmu use utf8;
35 1ddd2d4e 2023-09-10 jrmu use local::lib;
36 1ddd2d4e 2023-09-10 jrmu
37 1ddd2d4e 2023-09-10 jrmu use IO::Tee;
38 1ddd2d4e 2023-09-10 jrmu
39 1ddd2d4e 2023-09-10 jrmu my %files;
40 1ddd2d4e 2023-09-10 jrmu while (<>) {
41 1ddd2d4e 2023-09-10 jrmu chomp(my ($castaway, $item) = split /: /);
42 1ddd2d4e 2023-09-10 jrmu $castaway = lc($castaway);
43 1ddd2d4e 2023-09-10 jrmu if(!defined($files{$castaway})) {
44 1ddd2d4e 2023-09-10 jrmu $files{$castaway} = IO::File->new("$castaway.info", "w")
45 1ddd2d4e 2023-09-10 jrmu or die "Unable to write '$castaway.info': $!";
46 1ddd2d4e 2023-09-10 jrmu }
47 1ddd2d4e 2023-09-10 jrmu print {$files{$castaway}} "$castaway: $item\n";
48 1ddd2d4e 2023-09-10 jrmu }