----- 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>