Ordinary list arrays allow us to access their element by number. The
first element of array @food is $food[0]. The second element is
$food[1], and so on. But Perl also allows us to create arrays which
are accessed by string. These are called associative arrays.
To define an associative array we use the usual parenthesis notation,
but the array itself is prefixed by a % sign. Suppose we want to
create an array of people and their ages. It would look like this:
%ages = ("Michael Caine", 39,
"Dirty Den", 34,
"Angie", 27,
"Willy", "21 in dog years",
"The Queen Mother", 108);
Now we can find the age of people with the following expressions
$ages{"Michael Caine"}; # Returns 39
$ages{"Dirty Den"}; # Returns 34
$ages{"Angie"}; # Returns 27
$ages{"Willy"}; # Returns "21 in dog years"
$ages{"The Queen Mother"}; # Returns 108
Notice that like list arrays each % sign has changed to a $ to access
an individual element because that element is a scalar. Unlike list
arrays the index (in this case the person's name) is enclosed in curly
braces, the idea being that associative arrays are fancier than list
arrays.
An associative array can be converted back into a list array just by
assigning it to a list array variable. A list array can be converted
into an associative array by assigning it to an associative array
variable. Ideally the list array will have an even number of elements:
@info = %ages; # @info is a list array. It
# now has 10 elements
$info[5]; # Returns the value 27 from
# the list array @info
%moreages = @info; # %moreages is an associative
# array. It is the same as %ages
Associative arrays do not have any order to their elements (they are
just like hash tables) but is it possible to access all the elements
in turn using the keys function and the values function:
foreach $person (keys %ages)
{
print "I know the age of $person\n";
}
foreach $age (values %ages)
{
print "Somebody is $age\n";
}
When keys is called it returns a list of the keys (indices) of the
associative array. When values is called it returns a list of the
values of the array. These functions return their lists in the same
order, but this order has nothing to do with the order in which the
elements have been entered.
When keys and values are called in a scalar context they return the
number of key/value pairs in the associative array.
There is also a function each which returns a two element list of a
key and its value. Every time each is called it returns another
key/value pair:
while (($person, $age) = each(%ages))
{
print "$person is $age\n";
}
When you run a perl program, or any script in UNIX, there will be
certain environment variables set. These will be things like USER
which contains your username and DISPLAY which specifies which screen
your graphics will go to. When you run a perl CGI script on the World
Wide Web there are environment variables which hold other useful
information. All these variables and their values are stored in the
associative %ENV array in which the keys are the variable names. Try
the following in a perl program:
print "You are called $ENV{'USER'} and you are ";
print "using display $ENV{'DISPLAY'}\n";