At 09:48 AM 3/29/07 -0700, Wagner, David --- Senior Programmer Analyst ---
WGO wrote:
>> -----Original Message-----
>> From: Karyn Williams [mailto:[EMAIL PROTECTED] 
>> Sent: Wednesday, March 28, 2007 17:54
>> To: beginners@perl.org
>> Subject: RE: Exiting loops
>> 
>> At 04:10 PM 3/28/07 -0700, Wagner, David --- Senior 
>> Programmer Analyst ---
>> WGO wrote:
>> >    take the o off the /o This is in essence saying you only have to
>> >compile this once for the processing going on. Take that off and see
>> >what happens. I believe you would use /o if you have regex has no
>> >variables which are changing with each iteration.
>> >
>> >          If you have any problems or questions, please let me know.
>> >
>> 
>> Looks like that was it. I had added that because I read 
>> somewhere it was
>> supposed to speed up the search. Is there another way to speed it up ?
>> 
>       Karyn, The real question is how often are you doing this? How
>many users are involved? Would reading the data once and collecting the
>info into a hash and then reporting off the hash make sense. You are
>going through the file 5 times if you input 5 ids, 10 times if you have
>10 ids, etc. 
>
>       So step back and look at what is needed and then see if reading
>the data once and using a hash or related data field will give you the
>boost you need.

It varies greatly. Often one or two. Sometimes 70. The size of the files is
fairly substantial:

-rw-r--r--   1 root     other    249595095 Sep  1  2006 maillog.200608

I am getting Out of memory errors while running the script. I got them
before and was trying to make them go away with the /o. I also added
opening and closing the filehandle in each loop to try to fix this. Clearly
neither of those ideas worked.

I have hashed and slurped files in other scripts. I could try it here and
see what happens. 

>> >
>> >  Wags ;)
>> >David R Wagner
>> >Senior Programmer Analyst
>> >FedEx Freight
>> >1.408.323.4225x2224 TEL
>> >1.408.323.4449           FAX
>> >http://fedex.com/us 
>> > 
>> >
>> >> -----Original Message-----
>> >> From: Karyn Williams [mailto:[EMAIL PROTECTED] 
>> >> Sent: Wednesday, March 28, 2007 15:54
>> >> To: beginners@perl.org
>> >> Subject: Exiting loops
>> >> 
>> >> I have a sh script as follows. The script worked OK until the 
>> >> year rolled
>> >> over. My (now deleted) simple sh way of figuring the month 
>> >> and year blew
>> >> up. I decided to rewrite the script in perl because of the 
>> date/time
>> >> functions. It takes multiple commandline args (usernames) and 
>> >> checks for
>> >> various information on them. Since the maillogs are so large 
>> >> I want to exit
>> >> the first loop as soon as it is determined that the user has 
>> >> checked their
>> >> mail. 
>> >> 
>> >> #!/bin/sh
>> >> 
>> >> ext=`date +%Y%m`
>> >> 
>> >> month1="200702"
>> >> month2="200701"
>> >> month3="200612"
>> >> month4=200611
>> >> month5=200610
>> >> month6=200609
>> >> month7=200608
>> >> 
>> >> for i in $* ; do
>> >> 
>> >>         echo $i
>> >> 
>> >>         if test -r /export/home/$i/.forward ; then echo $i 
>> >> has forward file
>> >> ; continue ;
>> >>         elif [ "`fgrep -c "user=$i" /var/adm/maillog`" -gt 
>> >> "0" ] ; then
>> >> echo $i checked mail month 0 ;  continue ;
>> >>         elif [ "`fgrep -c "user=$i" 
>> >/export/home/archives/maillog.$month1`"
>> >> -gt "0" ] ; then echo $i checked mail month 1 ; continue;
>> >>         elif [ "`fgrep -c "user=$i" 
>> >/export/home/archives/maillog.$month2`"
>> >> -gt "0" ] ; then echo $i checked mail month 2 ; continue;
>> >>         elif [ "`fgrep -c "user=$i" 
>> >/export/home/archives/maillog.$month3`"
>> >> -gt "0" ] ; then echo $i checked mail month 3 ; continue;
>> >>         elif [ "`fgrep -c "user=$i" 
>> >/export/home/archives/maillog.$month4`"
>> >> -gt "0" ] ; then echo $i checked mail month 4 ; continue;
>> >>         elif [ "`fgrep -c "user=$i" 
>> >/export/home/archives/maillog.$month5`"
>> >> -gt "0" ] ; then echo $i checked mail month 5 ; continue;
>> >>         elif [ "`fgrep -c "user=$i" 
>> >/export/home/archives/maillog.$month6`"
>> >> -gt "0" ] ; then echo $i checked mail month 6 ; continue;
>> >>         else echo $i has not checked mail in the last 6 months ;
>> >>         fi
>> >>         
>> >>         echo checking last for 2007 ; last -3 $i
>> >>         echo checking 2007 dial-up ; fgrep -c P${i}
>> >> /var/adm/radacct/pleiades/detail
>> >>         echo checking for last modified file ; ls -lrt 
>> >> /export/home/$i |
>> >> tail -2
>> >>         echo checking for newest file in public_html ; ls -lrt
>> >> /export/home/$i/public_html | tail -2 
>> >>         ls -lsu /export/mail/$i
>> >>         quota -v $i
>> >>         finger -m $i
>> >>         
>> >> done
>> >> 
>> >> This is what I have so far in perl:
>> >> 
>> >> # cat tt.pl
>> >> #!/usr/bin/perl -w
>> >> 
>> >> use POSIX;
>> >> 
>> >> # Get the current month and year
>> >> my ($mon,$year) = (localtime)[4,5];
>> >> 
>> >> # Seed nmonth
>> >> 
>> >> my @nmonth = (1,1,1,1,$mon,$year,0,0);
>> >> 
>> >> my $sec  =  1;
>> >> my $min  =  1;
>> >> my $hour =  1;
>> >> my $day  =  1;
>> >> my $wday =  0;
>> >> my $yday =  0;
>> >> 
>> >> # Put the loop here
>> >> my $a = 1;
>> >> while ($a < 7) {
>> >>  
>> >>         my $current = mktime($sec, $min, $hour, $day, $nmonth[4],
>> >> $nmonth[5], $wday, $yday); # Make new timestamp for the first
>> >>         @nmonth = localtime($current);          # Make an 
>> >> array out of the
>> >> timestamp to get the month and year
>> >>         my $ext_mon = ($nmonth[4] + 1);         # Pull the 
>> >> month out of the
>> >> array and add 1 to get month number
>> >>         my $ext_year = ($nmonth[5] + 1900);     # Pull the 
>> >> year and add
>> >> 1900 to get the actual year
>> >>         if ($ext_mon <= 9) {                    # Make the 
>> >> month have two
>> >> places and write the var $ext
>> >>                 $ext = $ext_year . '0' . $ext_mon;
>> >>         }
>> >>         else {
>> >>                 $ext = $ext_year . $ext_mon;
>> >>         }
>> >> 
>> >>         push (@flist, $ext);
>> >>         $current = $current - 86400;    # Subtract one day 
>> >> from the first
>> >> timestamp to get the month before
>> >>         @nmonth = localtime($current);          # Make an 
>> >> array out of the
>> >> new timestamp for the next round
>> >> }
>> >> continue {
>> >>         $a++;
>> >> }
>> >> 
>> >> # This is the part I am having trouble with :
>> >> 
>> >> foreach $k (@ARGV) {
>> >> 
>> >>         if (-e ("/export/home/$k/.forward")) { 
>> >>                 print "User $k has a forward file.\n\n" ; next ;
>> >>         } else {
>> >>         
>> >>         open MAILLOG, "/var/adm/maillog" or die "couldn't 
>> >> open maillog :
>> >> $!\n";
>> >>                 if ($count = grep /user=$k/o, <MAILLOG> ) {
>> >>                 print "$k checked mail $count times in
>> >> /var/adm/maillog.\n"; next ;
>> >>                 } else {
>> >>         close MAILLOG; 
>> >> 
>> >>         open MAILLOG, 
>> "/export/home/archives/maillog.$flist[1]" or die
>> >> "couldn't open maillog.$flist[1] : $!\n";
>> >>                 if ($count = grep /user=$k/o, <MAILLOG> ) {
>> >>                         print "$k checked mail $count times in
>> >> maillog.$flist[1].\n"; next ;
>> >>                 } else {
>> >>         close MAILLOG; 
>> >> 
>> >>         open MAILLOG, 
>> "/export/home/archives/maillog.$flist[2]" or die
>> >> "couldn't open maillog.$flist[2] : $!\n";
>> >>                 if ( $count = grep /user=$k/o, <MAILLOG> ) {
>> >>                 print "$k checked mail $count times in
>> >> maillog.$flist[2].\n"; next ;
>> >>         } else {
>> >>         close MAILLOG;
>> >>         
>> >>         open MAILLOG, 
>> "/export/home/archives/maillog.$flist[3]" or die
>> >> "couldn't open maillog.$flist[3] : $!\n";
>> >>                 if ( $count = grep /user=$k/o, <MAILLOG> ) {
>> >>                 print "$k checked mail $count times in
>> >> maillog.$flist[3].\n"; next ;
>> >>         } else {
>> >>         close MAILLOG;
>> >>         
>> >>         open MAILLOG, 
>> "/export/home/archives/maillog.$flist[4]" or die
>> >> "couldn't open maillog.$flist[4] : $!\n";
>> >>                 if ( $count = grep /user=$k/o, <MAILLOG> ) {
>> >>                 print "$k checked mail $count times in
>> >> maillog.$flist[4].\n"; next ;
>> >>         } else {
>> >>         close MAILLOG;
>> >> 
>> >>         open MAILLOG, 
>> "/export/home/archives/maillog.$flist[5]" or die
>> >> "couldn't open maillog.$flist[5] : $!\n";
>> >>                 if ( $count = grep /user=$k/o, <MAILLOG> ) {
>> >>                 print "$k checked mail $count times in
>> >> maillog.$flist[5].\n"; next ;
>> >>         } else {
>> >>         close MAILLOG; print "$k has not checked their mail 
>> >> in the last 6
>> >> months.\n";
>> >> 
>> >>         }
>> >>         }
>> >>         }
>> >>         }
>> >>         }
>> >>         }
>> >> 
>> >> }
>> >> }
>> >> 
>> >> 
>> >> Input and output looks like this:
>> >> 
>> >> # ./tt.pl karyn smurphy root
>> >> karyn checked mail 2864 times in /var/adm/maillog.
>> >> smurphy checked mail 2864 times in /var/adm/maillog.
>> >> root checked mail 2864 times in /var/adm/maillog.
>> >> #
>> >> 
>> >> Yes, it goes to the next arg but as you can see, it returns 
>> >> the same count
>> >> for each subsequent arg. 
>> >> 
>> >> I feel that my braces are (all/part/some) of the problem, 
>> but not sure
>> >> how/what. Any suggestions would be appreciated.
>> >> 
>> >> 
>> >> -- 
>> >> 
>> >> Karyn Williams
>> >> Network Services Manager
>> >> California Institute of the Arts
>> >> [EMAIL PROTECTED]
>> >> http://www.calarts.edu/network
>> >> 
>> >> -- 
>> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >> http://learn.perl.org/
>> >> 
>> >> 
>> >> 
>> >
>> >*************************************************************
>> *********
>> >This message contains information that is confidential and 
>> proprietary to
>> FedEx Freight or its affiliates.  It is intended only for the 
>> recipient
>> named and for the express  purpose(s) described therein.  Any 
>> other use is
>> prohibited.
>> >*************************************************************
>> *********
>> >
>> >
>> >
>> -- 
>> 
>> Karyn Williams
>> Network Services Manager
>> California Institute of the Arts
>> [EMAIL PROTECTED]
>> http://www.calarts.edu/network
>> 
>> -- 
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>> http://learn.perl.org/
>> 
>> 
>> 
>
>-- 
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>http://learn.perl.org/
>
>
>
>
-- 

Karyn Williams
Network Services Manager
California Institute of the Arts
[EMAIL PROTECTED]
http://www.calarts.edu/network

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to