"Nick Chettle" <[EMAIL PROTECTED]> wrote in message ...
> Hi All,
Hi, Nick.
> #!/usr/bin/perl
This is a very good start. Never forget:
use warnings;
use strict;
These are two of the most important lines in the script!!!! :-)
If you had used these simple two lines, you would have found a major problem
with your script. You are using an entire line of text as an index for an
array. That doesn't make sense.
The line:
$msgids[$_] = $&;
attempts to use the entire line contained in the variable $_ as an index for
the array @msgids. Also, it is more efficient to capture want you want by
using parentheses in your reg exp and subsequently use $1 instead of $&. Not
a huge deal but worth noting.
> print "Please enter an e-mail address: ";
> chomp($email = <STDIN>);
>
> open MAILLOG, "/var/log/maillog";
>
> while (<MAILLOG>) {
> if (/$email/) {
> if (/[A-Z1-9]{8}/) {
> $msgids[$_] = $&;
> }
> }
> }
Again this is a great start. You definitely don't want to use an array, you
should use a hash instead. This should solve your delimma.
I am unfamiliar with the format of the Postfix mail log. However, you have
two choices, you can make the key of your hash the email address or the
message id. I am assuming that the message id is unique for each message. I
also assume that the email address is not. Both are good assumptions I hope.
----BEGIN CODE----
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
print "Please enter an e-mail address: ";
chomp(my $email = <STDIN>);
open MAILLOG, "/var/log/maillog";
my %msgids;
# If you want to record only one email address, uncomment
# the next 5 lines
#while (<MAILLOG>) {
# if ( my($addr) = /($email)/ and my($id) = /([A-Z1-9]{8})/ ) {
# $msgids{$addr}{$id} = $_;
# }
#}
# If you want to record all email addresses with the ability
# to go back and look at other email addresses
while (<MAILLOG>) {
# It is almost impossible to accurately match all valid
# email addresses. The next line is a very poor attempt. Apologies.
# See Jeffrey Friedl's "Mastering Regular Expressions" for more info.
if ( my($addr) = /([\w.&[EMAIL PROTECTED])/ and my($id) = /([A-Z1-9]{8})/ ) {
$msgids{$addr}{$id} = $_;
}
}
foreach my $id(keys %{ $msgids{$email} }) {
print $msgids{$email}{$id};
}
print "\n" x 3;
print Dumper \%msgids;
-----END CODE-----
Please note that if your mail log file is huge, it might take a signicant
amount of time and memory to add all of its lines to the %msgids hash. You
have been warned.
Good luck,
ZO
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>