Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Retunining hash values from subroutines

by packetstormer (Monk)
on Jun 20, 2013 at 11:33 UTC ( [id://1039956]=note: print w/replies, xml ) Need Help??


in reply to Retunining hash values from subroutines

You could be a bit cleaner still and not declare the %UID_PATH hash as many times. Also, as stated above, the reason you were getting one line is that your return value was within the while loop, meaning the only the last value would be returned. Moving it outside and cleaning up a little as below:

#!/usr/bin/perl use strict; my %ARR1 = uid(); foreach my $TAB (keys %ARR1) { print "User --> $TAB, Value --> $ARR1{$TAB}\n"; } sub uid { my %UID_PATH; open (FH1, "</etc/passwd") || die "Can't Open : $!"; while (<FH1>) { my @UID = split (/:/, $_); if ($UID[2] > 500) { my $USER = "$UID[0]"; $UID_PATH{$USER} = "$UID[5]"; } } return %UID_PATH; }

Replies are listed 'Best First'.
Re^2: Retunining hash values from subroutines
by Bindo (Acolyte) on Jun 20, 2013 at 12:16 UTC

    Thank you so very much gentlemen. You all are great :)

    Mr Packetst thank you very much I think I almost had it before I even began this thread but I lost it because of the has format I used.

    %UID_PATH = ("$USER" => "$UID[5]")

    instead of

    $UID_PATH{$USER} = "$UID[5]";

    Even though my problem is solved I still like to know as to how I should write the hash like the fist instance with the arrow, if at all possible. Kindly note if I write it that way only one entry from the /etc/passwd is returned.

      This line: %UID_PATH = ("$USER" => "$UID[5]")
      creates a hash containing the values "$USER" => "$UID5".

      Where as this line:
      $UID_PATH{$USER} = "$UID[5]"; adds a value to the already exsiting hash.
      So, if you want to iterate through a file and perform some logic then add the result to an existing hash you use the second line. As long as the hash key is unique it will simple add to the hash leaving you with the end result of a hash with multiple values.

      Here is a really simple example.

      #!/usr/bin/perl use strict; use warnings; use Data::Dumper; # Declare your hash my %hash; # Add the values below to the hash $hash{1} = "a"; $hash{2} = "b"; $hash{3} = "c"; print "Hash after adding values\n"; print Dumper \%hash; # Reinitialise hash - removing all previously added values %hash = ('1' => 'a'); print "Hash when reinitialised\n"; print Dumper \%hash;

      %UID_PATH = ("$USER" => "$UID[5]")

      creates a new hash, meaning that anything that existed before in %UID_PATH is wiped out. This syntax is OK to give initial values to a hash, but should not be used for anything else, expecially not for feeding new key/value pairs into the hash. For that, use the other syntax that you showed:

      $UID{$USER}= $UID[5]

      (or whatever it was exactly)...

      BTW, I would recommend against using upper case letters for variable names, it is a pain in the neck to type them, although I must admit it is largely a matter of personal taste. The most common practice is to have lower case letters for variables and functions, Title Case for package names, UPPER CASE for constants (and, often files handles and dir handles).

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1039956]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (8)
As of 2024-04-16 16:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found