Representing Relationships Between Data
Problem
You want to represent relationships between elements of data—for instance, the mother of relationship in a family tree or parent process for a process table. This is closely related to representing tables in relational databases (tables represent relationships between information) and to representing computer science graph structures (edges represent relationships between nodes).
Solution
Use a hash to represent the relationship.
Discussion
Here’s part of the family tree from the Bible:
%father = ( 'Cain' => 'Adam',
'Abel' => 'Adam',
'Seth' => 'Adam',
'Enoch' => 'Cain',
'Irad' => 'Enoch',
'Mehujael' => 'Irad',
'Methusael' => 'Mehujael',
'Lamech' => 'Methusael',
'Jabal' => 'Lamech',
'Jubal' => 'Lamech',
'Tubalcain' => 'Lamech',
'Enos' => 'Seth' );This lets us, for instance, easily trace a person’s lineage:
while (<>) {
chomp;
do {
print "$_ "; # print the current name
$_ = $father{$_}; # set $_ to $_'s father
} while defined; # until we run out of fathers
print "\n";
}We can already ask questions like “Who begat Seth?” by
checking the %father hash. By inverting this hash,
we invert the relationship. This lets us use Section 5.8 to answer questions like “Whom did
Lamech beget?”
while ( ($k,$v) = each %father ) {
push( @{ $children{$v} }, $k );
}
$" = ', '; # separate output with commas
while (<>) {
chomp;
if ($children{$_}) {
@children = @{$children{$_}};
} else {
@children = "nobody";
}
print "$_ begat @children.\n";
}Hashes can also represent ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access