----- Original Message -----
From: Nick Chettle <[EMAIL PROTECTED]>
Date: Wednesday, March 16, 2005 10:01 am
Subject: Re: Perl Analyzing Maillog
> Hi, Thanks, that seems a far better way to do it. A few things though:
>
> I am not 100% sure what this line does.
$msgids is a referance to a hash, this hash is a referance to an array. So you
are adding an array elemant to a-bit fancy data structur.
>
> push @{ $msgids->{$1} }, $_;
>
> Is the @{} surrounding the hash used to make push work with a
> hash?
yes, because you need to specify what type of a variable $msgids->{$1} is [
it's an array ref ].
> Also, why do you need -> and can't just do $msgids{$1}, $_; ?
. '->' means a referance, so here it's just a referance to a hash
>
> I made a slight change to make your addition work in that I added ()
> around the regex so that $1 would work - is there any reason to
> use this
> over $&?
not sure, my personal preferance I guess.
>
> So, AFAICS, your addition creates a hash (Using the message id's
> as the
> key) and puts the associated line from the log in the hash. So I
> thought
> I could simply do:
>
> for (sort keys %msgids) {
> print $msgids{$_};
> }
>
> To print each line found. For some reason this returns nothing.
That is because $msgids is not a hash, it's a referance to a hash. I thought
you where using strictures ?? Try this
for (sort keys %{ $msgids } ) {
print "Key = $_\n";
print "Hash Value: ", join ":",$msgids->{$_},"\n";
print "Array contains\n", join "\n",@{$msgids->{$_}};
}
>
> Thanks for your help. Hope my questions aren't too simple!
>
> Nick
>
> [EMAIL PROTECTED] wrote:
> >
> > ----- Original Message -----
> > From: Nick Chettle <[EMAIL PROTECTED]>
> > Date: Wednesday, March 16, 2005 7:02 am
> > Subject: Perl Analyzing Maillog
> >
> >
> >>Hi All,
> >
> > Hello,
> >
> >
> >>I am trying to write a simple script that will analyze a Postfix
> >>maillog. The basic idea is that you give it an e-mail address
> and
> >>it
> >>will print all the relevant lines. In order to achieve this, you
> >>first
> >>need a message ID, you can then search for the id and bring all
> >>the
> >>relevant information.
> >>
> >>This is what I have so far:
> >>
> >>#!/usr/bin/perl
> >>
> >>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[$_] = $&;
> >> }
> >> }
> >>}
> >>
> >>This works fine and it builds an array of all the message id's.
> I
> >>now
> >>need an efficient way of searching through the log again and
> >>pulling out
> >>all lines that contain a message id.
> >
> > You are already doing it, why not keep the results first time
> around ?? One was it to create a Ref to Hash Ref of Array's [ I
> prefer this, others may simply do a HoA ]
> >
> > while (<MAILLOG>) {
> > if (/$email/) {
> > if (/[A-Z1-9]{8}/) {
> > push @{ $msgids->{$1} }, $_;
> > }
> > }
> > }
> >
> >
> >
> >
> >>I can do this with:
> >>
> >>for (@msgids) {
> >> system "cat /var/log/maillog | grep $_";
> >>}
> >>
> >>But it's certainly not a very Perl way of doing it and it's less
> >>than
> >>efficient as I have to cat the entire maillog for each message id.
> >>
> >>I've been trying to open the filehandle again and then somehow
> get
> >>foreach to go through it but haven't had much sucess. Can anyone
> >>advise
> >>if I'm looking along the right lines or if there is a better way
> >>of
> >>doing it?
> >>
> >>Thanks, Nick
> >>
> >>--
> >>To unsubscribe, e-mail: [EMAIL PROTECTED]
> >>For additional commands, e-mail: [EMAIL PROTECTED]
> >><http://learn.perl.org/> <http://learn.perl.org/first-response>
> >>
> >>
> >>
> >
> >
>
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>