Note: written before parent node was updated.
Good idea, but far less than enough hubris. You can replace the entire repetitive beginning of the script by just a few lines:
sub make_rx_from {
open my $fh, "<", shift or warn("Can't open fromgood $!\n"), retur
+n;
chomp(my @line = <$fh>);
return map qr/$_/, @line;
}
my @togood = make_rx_from "togood";
my @receivedgood = make_rx_from "receivedgood";
my @badcontent = make_rx_from "contentbad";
my @maillists = make_rx_from "maillist";
my @badwords = make_rx_from "badwords";
my @frombad = make_rx_from "frombad";
my @fromgood = make_rx_from "fromgood";
But that's still far from ideal. Look at your code's main loop: you are examining a specific header, testing it against a whitelist and a blacklist, flagging accordingly. The same pattern every time. That can be factored out along these lines:
HEADER: foreach my $line (@$messref) {
# detects first blank line go do body check of first 10 body lines
last if $line =~ /^\s*$/;
my ($header) = grep $line =~ /^$_:/i, keys %test_for;
next unless $header;
for my $test (qw(ok bad)) {
my @match = grep $line =~ $_, @{ $test_for{$header}{$test} };
next if not @match;
$flag = $test;
print "Message $test - header $header matched: @match\n";
last HEADER;
}
}
You could also check the message size prior to any other tests for efficiency. I'll post the complete code as I refactored it in a separate node, for easier downloading.
Makeshifts last the longest.