my %messages = map { $_ => [] } qw(error alert warning); my $logfile = '/var/log/messages'; open my $log, "<", $logfile or die "$logfile: open: $!"; while (<$log>) { for my $type (keys %messages) { push @{ $messages{$type} }, $_ if /$type/; } } close $log or die "$logfile: close: $!"; # as long as we're bothering with explicit close, we may as well test it for success.