On 5 Mar 2003, jdavis wrote:

> hello,
>  I am trying to test a key from a hash in a hash
> the script gives me the desired result overall but i get
> the warning ...
> Use of uninitalized value in pattern match (m//) at ./passwd.pl line 26.
> could someone tell me why i get this error
> 
> here is the code (this scrip looks at /etc/passwd and gets  info
> from the desired field on a user - user and field args are passed on 
> command line...
> 
> 
> #! /usr/bin/perl -w
> ## fun with hash -- no pipe needed :)
>

Throw in a use strict too :-)
 
> $who = $ARGV[0];
> $what = $ARGV[1];
> 
> unless($who && $what ){
>         print "Usage - passwd.pl username field\n";
>         print "Ex.  passwd.pl root uid\n";
>         exit;
> }
> 
> $file = "/etc/passwd";
> open(PASS, "$file") || die "cant open file";
> @array = <PASS>;
> close(PASS);

You already have perl functions that do this for you
perldoc -f getpwnam

> 
> 
> for $i (@array){
>         @_ = split(/\:/, $i);

You don't have to escape ':'

You might want to store the result of split in a different array. @_ is 
also the array that contains the arguments to a subroutine. This can be 
confusing.

>         @fields = qw/user pass uid gid special home shell/;
>         $name = $_[0];
>         foreach $f (@fields){
>                 $hoh{"$name"}{$f} = shift(@_);
>         }
> }

You are reading in the entire /etc/passwd file and finally looking for 
only one entry. You can filter based on the username in the above for loop 
itself.

> 
> ## added \w test because roots uid is 0 therefor making tests false
> if($hoh{$who}{$what} =~ /\w/){
>         print "$hoh{$who}{$what}\n";
> }

You might want to check if the key $who is present in %hoh before 
accessing it. Use Data::Dumper to view the hash you have formed.
perldoc Data::Dumper;

> 
> else{
>         print "The combo $who and $what doesnt compute\n";
>         print "Try again - Bye\n";
> }
> 
> 
> thanks,
> 


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to