After:while (<INFILE>) {
$line = $_;
}
my $word = <STDIN>;
print $line if $line =~ /$word/;
# $line only contains the last line of the file!
# Officiate makes bad decision based on wrong output.
# Monk goes hungry.
After (fixed):while (<INFILE>) {
push @lines, $_;
}
$word = <STDIN>;
foreach (@lines) {
print if /$word/;
}
# File data is stored until $word is known.
# Officiate gets correct output, is pleased while file is small.
# Monk is thrashed when the disk thrashes on a large file.
Before:$word = <STDIN>;
while (<INFILE>) {
print if /$word/;
}
# There is no need to store the file data.
# Harmony is achieved.
Util comes out of Monk Funk, enters Homework Mode
Practical notes on Anonymous Monk's posted code:
- The first field in an array is $array[0], not $array[1].
- eq is for string comparisons. Use == for numbers.
- $self="something\n"; print "$self\n"; yields two newlines per line.
FWIW, here is how I would do this sort of thing in the real world. No huge files, @types dynamically calculated. Code tested.
#!/usr/bin/perl -W
use warnings 'all';
use strict;
# Scans the input file(s), breaking each line into fields.
# Builds a key from prettified $type, and stores an array of
# output lines in a hash under the key. Prints a list of all
# the types seen in the file(s), and asks the user to choose one.
# Prints the output lines stored for that key/type.
my $limit = 30;
my $usage = "Usage: $0 infile\n";
die $usage unless @ARGV;
sub pretty { return ucfirst lc shift }
my %lines;
while (<>) {
my ($whatever, $type, $num) = split;
my $key = pretty($type);
push @{ $lines{$key} }, "$type\t$num\n" if $num < $limit;
}
my @types = sort keys %lines;
my $ask = "Please select a category:\n";
$ask .= "\t$_. $types[$_]\n" foreach 0 .. $#types;
my $type;
while (not $type) {
print $ask;
chomp(my $choice = <STDIN>);
$type = $types[$choice] or print "$choice was not an option!\n" and
+next;
}
my $key = pretty($type);
print @{ $lines{$key} };
Clearly, Util is suffering from Perl Golf induced dementia.
Waits to get slammed with "Deprecated use of 'officiate'" error.