One of Perl’s most
interesting data structures is the hash, which makes it possible to create key-value
associations between data fragments. These hashes, although far more versatile
than plain-vanilla numerically-indexed arrays, are often intimidating to the
novice user. And that’s where this document comes in – it provides a crash
course in creating Perl
hashes, adding and deleting elements, building nested hashes and processing
hashes in a loop.
Defining hashes
First, what is a hash?
Essentially, it’s a string-indexed array, which means that instead of using
numbers to access individual elements, you use string labels. Here’s an
example:
Listing A
#!/usr/bin/perl
# define hash
%alphabet = (‘a’ => ‘apple’,
‘b’ => ‘ball’,
‘c’ => ‘cat’,
‘x’ => ‘xylophone’);
The line above creates
a Perl hash with four key-value pairs. Notice the % sign before the variable name to denote that it is a
hash, and the use of arrows to indicate the key-value relationships.
You could also write
this as:
Listing B
#!/usr/bin/perl
# define hash
%alphabet = (‘a’, ‘apple’, ‘b’, ‘ball’, ‘c’, ‘cat’, ‘x’, ‘xylophone’);
Once you’ve defined a
hash, you can access individual elements by name. So, for example, the
following code:
Listing C
#!/usr/bin/perl
# define hash
%alphabet = (‘a’, ‘apple’, ‘b’, ‘ball’, ‘c’, ‘cat’, ‘x’, ‘xylophone’);
# access hash value
print “A is for ” . $alphabet{‘a’};
Would output as:
A is for apple.
To clear a hash, simply
assign it an empty data set, as in the following example:
Listing D
#!/usr/bin/perl
# (re)initialize hash
%alphabet = ();
Adding, changing and deleting hash elements
You can add a new
element to a hash (or alter an existing one) simply by setting a new value for
the corresponding key. If the key does not already exist, it will be created.
Here’s an example:
Listing E
#!/usr/bin/perl
# define hash
%alphabet = (‘a’, ‘apple’, ‘b’, ‘ball’, ‘c’, ‘cat’, ‘x’, ‘xylophone’);
# add new element
$alphabet{‘d’} = ‘dog’;
# change existing element
$alphabet{‘a’} = ‘arrow’;
# access hash value
print “A is for ” . $alphabet{‘a’};
You can delete a
key-value pair from a hash by using the delete()
function, as below:
Listing F
#!/usr/bin/perl
# define hash
%alphabet = (‘a’, ‘apple’, ‘b’, ‘ball’, ‘c’, ‘cat’, ‘x’, ‘xylophone’);
# delete element
delete $alphabet{‘x’};
Retrieving keys and values
Perl lets you extract
the keys and values of a hash into separate data structures, useful if you need
to reprocess them further. You can use the keys()
function to return the keys of a hash as a numerically-indexed array. Here’s an example:
Listing G
#!/bin/perl
# define hash
%alphabet = (‘a’ => ‘apple’, ‘b’ => ‘bat’, ‘c’ => ‘cat’);
# get and print hash keys
@keys = keys(%alphabet);
print “@keys “;
Alternatively, you can
use the values()
function to get an array of only the hash values, as below:
Listing H
#!/bin/perl
# define hash
%alphabet = (‘a’ => ‘apple’, ‘b’ => ‘bat’, ‘c’ => ‘cat’);
# get and print hash values
@vals = values(%alphabet);
print “@v “;
Calculating hash size
The easiest way to
calculate how large a hash is, is to use the aforementioned keys()
function to extract the hash keys into an array and then retrieve the size of
the array. Here’s how:
Listing I
#!/bin/perl
# define hash
%alphabet = (‘a’ => ‘apple’, ‘b’ => ‘bat’, ‘c’ => ‘cat’);
# print number of hash elements
print “The hash has ” . scalar(keys(%alphabet)) . ” elements\n”;
Processing hash elements
It’s also easy to
process all the elements in a hash using a while()
loop. Here’s a simple example:
Listing J
#!/usr/bin/perl
# define hash
%alphabet = (‘a’, ‘apple’, ‘b’, ‘ball’, ‘c’, ‘cat’, ‘x’, ‘xylophone’);
# loop over hash
while (($key, $value) = each(%alphabet) ) {
print “$key is for $value\n”;
}
Alternatively, use a for() loop
with the keys() function discussed previously:
Listing K
#!/usr/bin/perl
# define hash
%alphabet = (‘a’, ‘apple’, ‘b’, ‘ball’, ‘c’, ‘cat’, ‘x’, ‘xylophone’);
# loop over hash
for $k (keys(%alphabet)) {
print $k . ” is for ” . $hash{$key} . “\n”;
}
Using nested hashes
Perl also lets you
“nest” one hash (or array) within another hash (or array). This
allows for a great deal of flexibility when formulating long and complex data
structures. Here’s an example:
Listing L
#!/usr/bin/perl
%movies = (
‘black’ => {‘hero’ => ‘Batman’, ‘villain’ => ‘The Penguin’},
‘red’ => [{‘hero’ => ‘Spiderman’, ‘villain’ => ‘Green Goblin’},
{‘hero’ => ‘Superman’, ‘villain’ => ‘LexLuthor’}]
);
# retrieve and print values
print $movies{‘black’}{‘hero’} . ” fights ” . $movies{‘black’}{‘villain’} . “\n”;
print $movies{‘red’}[1]{‘hero’} . ” fights ” . $movies{‘red’}[1]{‘villain’} . “\n”;
This code returns:
Batman fights The Penguin
Superman fights LexLuthor
And that’s about all
you need to get started with Perl hashes. Have fun, and see you soon!