"Perl for Perl Newbies" - Part 2Hashes

2. Hashes

Hashes can be used to map a set of keys, each to his own value. Using a hash one can retrieve the value associated with each key, as well as get a list of all the keys present in the hash.

To assign or retrieve the value of the key $mykey in the hash $myhash one uses the $myhash{$mykey} convention. To check if a key exists in a hash one should type exists($myhash{$mykey}) which in turn returns a boolean value that corresponds to its existence.

An array whose elements are the keys present in the hash can be retrieved by typing keys(%myhash). Here's a short example, that runs a simple bank, that will illustrate this functionality:

# Initialize the valid operations collection
$ops{'create'} = 1;
$ops{'deposit'} = 1;
$ops{'status'} = 1;
$ops{'exit'} = 2;

while (1)
{
    # Get a valid input from the user.
    while (1)
    {
        print "Please enter what you want to do:\n";
        print "(" . join(", ", keys(%ops)) . ")\n";

        $function = <>;
        chomp($function);

        if (exists($ops{$function}))
        {
            last;
        }
        print "Unknown function!\n Please try again.\n\n"
    }

    if ($function eq "exit")
    {
        last;
    }

    print "Enter the name of the account:\n";
    $account = <>;
    chomp($account);
    if ($function eq "create")
    {
        if (! exists($bank_accounts{$account}))
        {
            $bank_accounts{$account} = 0;
        }
    }
    elsif ($function eq "status")
    {
        if (! exists ($bank_accounts{$account}) )
        {
            print "Error! The account does not exist.\n";
        }
        else
        {
            print "There are " . $bank_accounts{$account} .
                " NIS in the account.\n";
        }
    }
    elsif ($function eq "deposit")
    {
        if (exists($bank_accounts{$account}) )
        {
            print "How much do you wish to deposit?\n";
            $how_much = <>;
            chomp($how_much);
            $bank_accounts{$account} += $how_much;
        }
    }
    print "\n";
}

The following example, which is considerably shorter, uses a hash to find out if a list of strings contains only unique strings:

while($string = <>)
{
    chomp($string);
    if (exists($myhash{$string}))
    {
        print "The string \"" . $string . "\" was already encountered!";
        last;
    }
    else
    {
        $myhash{$string} = 1;
    }
}

Written by Shlomi Fish