Chad Kellerman wrote:
> 
> Hello everyone,

Hello,

>    I am starting to work on a script that is going to process a few
> files in some users directories.  I thought I would do some checking on
> the file to make sure they are there and to make sure they are really
> files.  I thought it was going to be pretty straight forward, until I
> ran it for the first time.  Sometimes the script sees the file for one
> user but not the next ( that I know is there)?
>    I must be misunderstanding something small, but I can't figure it
> out.
>    Can anyone offer any suggestions?

Certainly.


> #!/usr/local/bin/perl
>     eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
>        if 0; #$running_under_some_shell

Do you really need those two lines?

> use strict;
> use warnings;
> use Sys::Hostname;
> $|++;
> 
> use vars qw(
>              $server $pwdfile @users
>            );

In most modern Perls you would use our() instead of "use vars".

our ( $server, $pwdfile, @users );


> $server = hostname();
> $pwdfile = '/etc/passwd';

Most Perl programmers advocate declaring and defining your variables at the same time.

our $server = hostname();
our $pwdfile = '/etc/passwd';


> # get users
> open (PASSWD,"$pwdfile")
>     or die "Cannot open passwd file: $!";
> while (my $pwdline = <PASSWD>)

Perl provides a built-in function getpwent() that reads from the password file and
also the User::pwent module.


> {
>     my ($user,$home,$shell) = (split /:/, $pwdline)[0,5,6];
>     next if ( $home !~ /^\/home/ || $shell !~ /^\/bin/
>               || $user eq "ftp" || $user eq "www");
>    push @users, $user;
> }
> close (PASSWD);
> 
> foreach my $user(@users)
> {
>   print "Starting $user...\n";
>   #print glob ("/home/$user/*-logs/old/200312/access-log.31-*.gz")."\n";
>   $user = trim($user);

You are modifying the user entry returned from the passwd file.  Are you sure you
want to do that?  (Hint: probably not.)


>   my $decfile = glob
> ("/home/$user/*-logs/old/200312/access-log.31-*.gz");
>   my $janfile = glob
> ("/home/$user/*-logs/old/200401/access-log.01-*.gz");
> 
>   if (!$decfile)
>   {
>     print "\t\\Could not find Dec 31,2003 access log.\n";
>     next;
>   }
>   elsif (!-f $decfile)
>   {
>     print "\t\\Dec 31,2003 access log is not a file.\n";
>     next;
>   }
>   elsif (!$janfile)
>   {
>     print "\t\\Could not find Jan 01,2004 access log.\n";
>     next;
>   }
>   elsif (!-f $janfile)
>   {
>      print "\t\\Jan 01,2004 access log is not a file.\n";
>      next;
>   }
>   else
>   {
>     print "\t\\$user has both access logs.\n";
>   }

You can simplify that a bit:

my @files = grep -f, glob 
"/home/$user/*-logs/old/{200312,200401}/access-log.{31,01}-*.gz";
print "\t\\$user has both access logs.\n" if @files == 2;


> }
> 
> # subs
> sub trim
> {
>   my @in = @_;
>   for (@in)
>   {
>       s/^\s+//;
>       s/\s+$//;
>       s/\n//g;
>   }
>   return wantarray ? @in : $in[0];
> }


John
-- 
use Perl;
program
fulfillment

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


Reply via email to