http://qs1969.pair.com?node_id=1039963


in reply to Re: Retunining hash values from subroutines
in thread Retunining hash values from subroutines

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.

Replies are listed 'Best First'.
Re^3: Retunining hash values from subroutines
by packetstormer (Monk) on Jun 20, 2013 at 12:59 UTC
    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;

Re^3: Retunining hash values from subroutines
by Laurent_R (Canon) on Jun 20, 2013 at 21:24 UTC
    %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).