Lesson 16 | Arrays and hashes together |
Objective | Learn how to create multiple associations from one table of data. |
Perl Hash Association
Sometimes you want several associations from one table of data.
For example, you can create the %viceprez hash from two separate arrays:
@presidents = (
'Franklin D. Roosevelt', 'Harry S. Truman',
'Dwight D. Eisenhower', 'John F. Kennedy',
'Lyndon B. Johnson', 'Richard M. Nixon',
'Gerald R. Ford', 'Jimmy Carter',
'Ronald W. Reagan', 'George Bush',
'Bill Clinton' );
@viceprez = (
'Henry A. Wallace', 'Alben W. Barkley',
'Richard M. Nixon', 'Lyndon B. Johnson',
'Hubert H. Humphrey', 'Spiro T. Agnew',
'Nelson A. Rockefeller', 'Walter F. Mondale',
'George H. Bush', 'J. Dan Quayle',
'Al Gore, Jr.' );
for ($i = 0; $presidents[$i]; $i++) {
$viceprez{$presidents[$i]} = $viceprez[$i];
}
The values of one array can be used to key into several hashes.
Adding this definition to our example,
When the Presidents took office
@tookoffice = (
1933, 1945, 1953, 1961, 1963, 1969,
1974, 1977, 1981, 1989, 1993 );
for ($i = 0; $presidents[$i]; $i++) {
$tookoffice{$presidents[$i]} = $tookoffice[$i];
}
This could be printed:
foreach $p (@presidents) {
print "$p: ",
"VP: $viceprez{$p}, ",
"took office: $tookoffice{$p}\n";
}
This produces the following result:
Franklin D. Roosevelt: VP: Henry A. Wallace, took office: 1933
Harry S. Truman: VP: Alben W. Barkley, took office: 1945
Dwight D. Eisenhower: VP: Richard M. Nixon, took office: 1953
John F. Kennedy: VP: Lyndon B. Johnson, took office: 1961
Lyndon B. Johnson: VP: Hubert H. Humphrey, took office: 1963
Richard M. Nixon: VP: Spiro T. Agnew, took office: 1969
Gerald R. Ford: VP: Nelson A. Rockefeller, took office: 1974
Jimmy Carter: VP: Walter F. Mondale, took office: 1977
Ronald W. Reagan: VP: George H. Bush, took office: 1981
George Bush: VP: J. Dan Quayle, took office: 1989
Bill Clinton: VP: Al Gore, Jr., took office: 1993
One nice alternative to this method of keying multiple data from one list requires more complex data structures, which we will cover later in this module.
Note: a common mistake in working with hashes is to use the keys function to step through the hash like this:
foreach $p (keys %viceprez) {
print "$p: $viceprez{$p}\n"
}
That works fine, as long as your hash is small. The problem is that the keys function copies the entire hash in memory, which can cause swapping or worse if your hash is large. It is usually good to get into the habit of using each instead for the same result:
while(($p, $v) = each %viceprez) {
print "$p: $v\n";
}
You get the same data, in the same order, without copying the whole hash in memory.
Array Hash - Exercise
We have covered quite a bit of ground in the past few lessons, and you should now have a pretty good grasp of arrays and hashes.
Take the time now to complete the exercise in which an HTML table using Perl will be created.
Click the exercise link to complete the
Array Hash - Exercise
You will build on this knowledge when you move on to the more-complex data structures in the next lesson.