At 04:30 PM 2/23/09 -0800, Karyn Stump wrote:
>I am trying to learn subroutines. I have seen refernces to using my and
>local for passing variables so I am playing with them to try to understand
>better how this all works. 
>
>I have a subroutine in the script below, printsub that errors when it is
>run with 
>
>Global symbol "$name" requires explicit package name at ./user-sub.pl line
>143.
>Global symbol "$name" requires explicit package name at ./user-sub.pl line
>144.
>Execution of ./user-sub.pl aborted due to compilation error



Continued searching on the net turned up 

http://perl.plover.com/FAQs/Namespaces.html

which declares "Always use my, never use local." and a good explanation of
why. 

Just in case anyone else has this question and searches the archives.



>
>This is the code pulled out of easy viewing:
>
>sub printsub
>{
>    local($name) = $_[0];
>    print "This is the value of $name in the subroutine.\n";       
>}
>
>The second sub in this script works using:
>
>    my $name = shift(@_);
>
>another example I found online.
>
>I would appreciate some help understanding if or how local can be used in
>this context. Also if there is a better/preferred way to pass this var to
>the sub.
>
>TIA,
>
>Karyn
>
>
>
>
>Here is the whole script:
>
>#!/usr/bin/perl
>
>use strict;
>use warnings;
>
># Open passwd file to compare arguments to to make sure they are valid
>usernames
>
>my $pwfile = "/etc/passwd";
>
>open (PW, "<$pwfile") or die "Can't open PW $pwfile : $!";
>
># Create extenions for log files as the older ones have a bz2 extension.
>They will also need 
># a different command to grep them than the current log file.
>
>my @extension;
>push @extension, '';               # Place null in [0] so that it will be
>false the first loop for $log
>
>my $increment = 0;
>my $ext = ".bz2";
>
>while (@extension < 6)
>{
>  push @extension, ".$increment$ext";
>  $increment++;
>}
>
>my $pwf = do { local $/; <PW> };
>close PW or warn "Error closing PW $!";
>
>foreach my $user (@ARGV) 
>{
>    
>  print "Checking $user\n";
>
>  if ($pwf !~ /\b$user\b/) 
>  {
>    print "$user is not a valid login name.\n\n";
>    next;
>  }
>
>  if (-e "/usr/home/$user/.forward") 
>  { 
>    print "User $user has a forward file.\n\n";
>    my $forward = "/usr/home/$user/.forward";           
>    open (INFO, "<$forward") or die "Can't open INFO $forward : $!";
>    my @lines = <INFO>;                         
>    close(INFO);                        
>    print @lines;                       
>    my $quota = `quota -v $user`;
>    print "User $user quota is $quota\n";
>    next;
>  }
>
>  my $count;
>  my $log;
>  my $bzcat = "/usr/bin/bzcat";
>
>  foreach my $end (@extension) 
>  {
>
>    $log = "/var/log/maillog$end";
>
>    if ($end =~ /bz2/)
>    {
>    open (MAILLOG, '-|', "$bzcat $log") or warn "Couldn't run '$bzcat
>$log': $!";
>    #print "That worked - Opened file with bzcat\n";
>    }
>    else
>    {
>    open (MAILLOG, $log) or warn "Couldn't open maillog $log: $!";
>    #print "Opened file without bzcat\n";
>    }
>
>    $count = 0;
>    while (<MAILLOG>) 
>    {
>      #$count++ if /user=$user /;
>      $count++ if /user=\<$user/;
>    }
>    last if $count;
>    close MAILLOG or warn $! ? "error closing $log: $!" : "Exit status $?
>from $$bzcat";
>    #print "Closing MAILLOG here\n";
>  }
>
>  
>  if ($count) 
>  {
>    $log =~ s|.*archives/||;            # Strip out path before filename
>    print "$user checked mail $count times in $log.\n";
>    my $quota = `quota -v $user`;
>    print "User $user quota is $quota\n";
>
>  } 
>  else 
>  {
>    print "$user is not in the maillog for the last 6 months.\n";       
>    
>        my @directories = ("/usr/home/$user/public_html", "/usr/home/$user");
>
>        foreach my $directory (@directories) 
>        {
>        if (-d $directory) 
>        {
>            my @files =();
>            opendir DIR, $directory or die "Error reading $directory: $!n";
>            my @sorted = sort {-M "$directory/$a" <=> -M "$directory/$b"}
>            readdir(DIR);
>            closedir DIR;
>            foreach my $item (@sorted) 
>            {
>                push(@files,$item) unless $item eq "." or $item eq "..";
>            }
>
>             my $count = @files;
>             if ($count > 0) 
>            {
>            my $age = sprintf("%.1f",(-M "$directory/$files[0]"));
>            print "Newest file in $directory is $files[0] and it is $age
>days old.\n";
>            } 
>            else 
>            {
>                print "User $user has no files in their $directory
>directory.\n";
>            } 
>         }
>         else
>         {
>             print "No $directory found.\n";
>         }
>  }
>
>  # end of directory search
>
>  }
> 
> &printsub($user);
> &lastsub($user);
>
>  print "\n";
>
>}
>
>sub printsub
>{
>    local($name) = $_[0];
>    print "This is the value of $name in the subroutine.\n";       
>}
>
>sub lastsub
>{
>  # Check for logins with last
>
>    my $name = shift(@_);
>    my @command1 = `last -n 1 $name`;
>    chomp(@command1);
>
>    if ($command1[0] eq '')
>    {
>         print "$name has not logged in since $command1[1].\n";
>    }
>    else
>    {
>         print "$command1[0].\n";
>    }
>
>}
>
>
>
>-- 
>
>Karyn Stump
>Network Services Manager
>California Institute of the Arts
>ka...@calarts.edu
>http://noc.calarts.edu
>
>-- 
>To unsubscribe, e-mail: beginners-unsubscr...@perl.org
>For additional commands, e-mail: beginners-h...@perl.org
>http://learn.perl.org/
>
>
>
-- 

Karyn Stump
Network Services Manager
California Institute of the Arts
ka...@calarts.edu
http://noc.calarts.edu

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to