Perl One Dimensional Hash Functions on Hash of Arrays
Perl Two-Dimensional Structures – Part 2
Foreword: In this part of the series, I talk about the one-dimensional hash functions on a Perl hash-of-arrays data structure.
By: Chrysanthus Date Published: 2 Apr 2016
Introduction
The each Function on a Hash-of-Arrays
The syntax for the each function of a one-dimensional hash is,
my ($key, $value) = each (%HashName)
For the one-dimensional hash, the each function returns the next key/value pair of the hash. The each function is used for a hash-of arrays in the same way, but the value is a reference to an array. The key is still whatever string you typed in. To dereference the reference variable, just precede it with a $ symbol and use the square brackets indexing to obtain an array value, as in,
$$value[i]
When you dereferemce an array reference, you obtain an array as if it was, @arr. Read and try the following code that reads the second values of two rows of a hash-of-arrays structure:
use strict;
my %Ha;
$Ha{'Header'} = ["Geography", "History", "Physics", "Math"];
$Ha{'Joan Mary'} = [50, 64, 14, 85];
$Ha{'John Smith'} = [78, 20, 85, 55];
$Ha{'Suzan Wright'} = [22, 33, 44, 55];
$Ha{'Peter Jones'} = [66, 77, 88, 99];
$Ha{'James Bond'} = [52, 42, 32, 22];
$Ha{'John Rambo'} = [71, 72, 73, 74];
$Ha{'Spider Man'} = [75, 76, 77, 78];
$Ha{'Iron Man'} = [81, 80, 79, 78];
my ($key0, $value0) = each(%Ha);
my $var0 = $$value0[1];
my ($key1, $value1) = each(%Ha);
my $var1 = $$value1[1];
print $var0, "\n";
print $var1, "\n";
Note: the 0 and 1 in the variables $value0 and $value1 are part of the names and nothing else. Remember, the order in which you type the key/value (keys/row) pairs, is not necessarily the order in which the elements (key/value pairs) are read or printed.
The syntax of the keys function for a one-dimensional hash is,
keys (%hashName)
It returns an array of all the keys in the hash. For a two-dimensional hash-of-arrays structure, it still returns all the keys of the hash-of-arrays. The order of the return keys is not necessarily the order in which the keys were typed. Remember, a hash-of-arrays truly has but key/array-reference pairs. Read and try the following code, which displays two keys of the hash-of-arrays:
use strict;
my %Ha;
$Ha{'Header'} = ["Geography", "History", "Physics", "Math"];
$Ha{'Joan Mary'} = [50, 64, 14, 85];
$Ha{'John Smith'} = [78, 20, 85, 55];
$Ha{'Suzan Wright'} = [22, 33, 44, 55];
$Ha{'Peter Jones'} = [66, 77, 88, 99];
$Ha{'James Bond'} = [52, 42, 32, 22];
$Ha{'John Rambo'} = [71, 72, 73, 74];
$Ha{'Spider Man'} = [75, 76, 77, 78];
$Ha{'Iron Man'} = [81, 80, 79, 78];
my @keys = keys(%Ha);
print $keys[0], "\n";
print $keys[1], "\n";
In scalar context the function returns the number of keys in the hash-of-arrays.
The values Function
The syntax of the keys function for a one-dimensional hash is:
values (%hashName)
It returns an array of all the values in the hash. For a two-dimensional hash-of-arrays structure, it returns all the array references of the arrays in the hash. The return list of references can be held in an array. The order of the return references is not necessarily the order in which the arrays were typed. Remember, a hash-of-arrays has key/array-reference pairs. Read and try the following code, which displays the first values of two of the arrays in a hash-of-arrays structure:
use strict;
my %Ha;
$Ha{'Header'} = ["Geography", "History", "Physics", "Math"];
$Ha{'Joan Mary'} = [50, 64, 14, 85];
$Ha{'John Smith'} = [78, 20, 85, 55];
$Ha{'Suzan Wright'} = [22, 33, 44, 55];
$Ha{'Peter Jones'} = [66, 77, 88, 99];
$Ha{'James Bond'} = [52, 42, 32, 22];
$Ha{'John Rambo'} = [71, 72, 73, 74];
$Ha{'Spider Man'} = [75, 76, 77, 78];
$Ha{'Iron Man'} = [81, 80, 79, 78];
my @values = values(%Ha);
print $values[0][0], "\n"; #referring to @values and not values(%Ha)
print $values[1][0], "\n"; #referring to @values and not values(%Ha)
@values in the code has references to other arrays, and so it is a normal two-dimensional array, so you access a cell value using the two square bracket pairs. If you have $values instead of @values, meaning you have a reference to a two-dimensional array, you would have to double the $ symbol as well, to access the value of a cell.
The syntax for the exist function for a one-dimensional hash is,
exists ($hash{'$key'})
It returns true if the key of the hash has ever been initialized (has ever had a value); if the key/value pair element does not exists, it returns false. For a two-dimensional hash-of-arrays structure it returns true if the key has a corresponding array, otherwise it returns false. Read and try the following code that illustrates this:
use strict;
my %Ha;
$Ha{'Header'} = ["Geography", "History", "Physics", "Math"];
$Ha{'Joan Mary'} = [50, 64, 14, 85];
$Ha{'John Smith'} = [78, 20, 85, 55];
$Ha{'Suzan Wright'} = [22, 33, 44, 55];
$Ha{'Peter Jones'} = [66, 77, 88, 99];
$Ha{'James Bond'} = [52, 42, 32, 22];
$Ha{'John Rambo'} = [71, 72, 73, 74];
$Ha{'Spider Man'} = [75, 76, 77, 78];
$Ha{'Iron Man'} = [81, 80, 79, 78];
if (exists($Ha{'John Smith'}))
{
print "'John Smith' had been initialized with an array.", "\n";
}
if (!exists($Ha{'Mary Magnet'}))
{
print "There is no element with key, 'Mary Magnet'.", "\n";
}
Note the use of the ! operator before one of the exists() function.
The syntax for the delete function for a one-dimensional hash is:
delete ($hash{'$key'})
This function deletes an element in the hash, such that the exists() function does not return true for the element. That is, the key and corresponding value pair are deleted. For a two-dimensional hash-of-arrays structure, the meaning is the same but you have key/array pairs. Read and try the following code:
use strict;
my %Ha;
$Ha{'Header'} = ["Geography", "History", "Physics", "Math"];
$Ha{'Joan Mary'} = [50, 64, 14, 85];
$Ha{'John Smith'} = [78, 20, 85, 55];
$Ha{'Suzan Wright'} = [22, 33, 44, 55];
$Ha{'Peter Jones'} = [66, 77, 88, 99];
$Ha{'James Bond'} = [52, 42, 32, 22];
$Ha{'John Rambo'} = [71, 72, 73, 74];
$Ha{'Spider Man'} = [75, 76, 77, 78];
$Ha{'Iron Man'} = [81, 80, 79, 78];
delete ($Ha{'John Smith'});
if (!exists($Ha{'John Smith'}))
{
print "key 'John Smith' has never been initialized or never existed.", "\n";
}
That is it for this part of the series. We stop here and continue in the next part.
Chrys
Related Links
Perl BasicsPerl Data Types
Perl Syntax
Perl References Optimized
Handling Files and Directories in Perl
Perl Function
Perl Package
Perl Object Oriented Programming
Perl Regular Expressions
Perl Operators
Perl Core Number Basics and Testing
Commonly Used Perl Predefined Functions
Line Oriented Operator and Here-doc
Handling Strings in Perl
Using Perl Arrays
Using Perl Hashes
Perl Multi-Dimensional Array
Date and Time in Perl
Perl Scoping
Namespace in Perl
Perl Eval Function
Writing a Perl Command Line Tool
Perl Insecurities and Prevention
Sending Email with Perl
Advanced Course
Miscellaneous Features in Perl
Perl Two-Dimensional Structures
Advanced Perl Regular Expressions
Designing and Using a Perl Module
More Related Links
Perl Mailsend
PurePerl MySQL API
Perl Course - Professional and Advanced
Major in Website Design
Web Development Course
Producing a Pure Perl Library
MySQL Course
BACK NEXT