#!/usr/bin/perl
# Perl Assignment - Hash of Hashes
# J Student
# Teams using a Hash of Hashes
# Sport Activity Teams Year Owner Leader Famous Popularity
# Badminton 1934 Duke of Beaufort Poul-Erik Høyer Larsen Lin Dan 220,000,000
# Golf 1894 PGA of America Professional Golfers' Association Tiger Woods 66,600,000
# Yoga 1975 Patanjali Guruji Paramanhansa Yogananda 300,000,000
# Running 1967 Ancient Greece Running Industry Association Dean Karnazes 60,000,000
# Bowling 1988 US Bowling Congress Walter Ray Williams Jr Earl Anthony 100,000,000
# I have created the following array:
@teams = ( "Badminton" , "Golf" , "Yoga" , "Running" , "Bowling" ) ;
# and the following Hash of Hashes:
%myTeams = ( "Badminton" => { yearBorn => 1934 ,
owner => "Duke of Beaufort" ,
leader => "Poul-Erik Høyer Larsen" ,
famous => "Lin Dan" ,
popularity => "220M"
} ,
"Golf" => { yearBorn => 1894 ,
owner => "PGA of America" ,
leader => "Professional Golfers' Association" ,
famous => "Tiger Woods" ,
popularity => "66M"
} ,
"Yoga" => { yearBorn => 1975 ,
owner => "Patanjali" ,
leader => "Guruji" ,
famous => "Paramanhansa Yogananda" ,
popularity => "300M"
} ,
"Running" => { yearBorn => 1967 ,
owner => "Ancient Greece" ,
leader => "Running Industry Association" ,
famous => "Dean Karnazes" ,
popularity => "60M"
} ,
"Bowling" => { yearBorn => 1988 ,
owner => "US Bowling Congress" ,
leader => "Walter Ray Williams Jr" ,
famous => "Earl Anthony" ,
popularity => "100M"
} ,
) ;
# To print out sorted Team information in the Hash of Hashes (ascending order):
print ( "\n \n My Team - sorted by Team Name ascending:\n \n " ) ;
printf ( "%-10s \t %-6s \t %-20s \t %-30s \t %-19s \t %-10s" , "Team" , "Year" , "Owner" , "Leader" , "Famous" , "Popularity" ) ;
@sortedKeys = sort ( @teams ) ;
for $teamName ( @sortedKeys ) {
$yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$leader = $myTeams { $teamName } { 'leader' } ;
$famous = $myTeams { $teamName } { 'famous' } ;
$popularity = $myTeams { $teamName } { 'popularity' } ;
printf ( "%-10s \t %-6s \t %-20s \t %-30s \t %-19s \t %-10s \n " , $teamName , $yearBorn , $owner , $leader , $famous , $popularity ) ; }
# To print out sorted Team information in the Hash of Hashes (descending order):
print ( "\n \M y Team - sorted by Team Name decending:\n \n " ) ;
printf ( "%-10s \t %-10s \t %-10s \t %-10s \t %-10s \t %-10s \n " , "Team" , "Year" , "Owner" ) ;
@reverseKeys = reverse ( @sortedKeys ) ;
for $teamName ( @reverseKeys ) {
$yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
printf ( "%-10s \t %-10s \t %-10s \n " , $teamName , $yearBorn , $owner ) ;
}
printf ( "\t %-5s \n " , "Leader" ) ; for $teamName ( @reverseKeys ) {
$leader = $myTeams { $teamName } { 'leader' } ;
}
printf ( "\t %-5s \n " , "Famous" ) ; for $teamName ( @reverseKeys ) {
$famous = $myTeams { $teamName } { 'famous' } ;
}
printf ( "\t %-5s \n " , "Popularity" ) ; for $teamName ( @reverseKeys ) {
$popularity = $myTeams { $teamName } { 'popularity' } ;
printf ( "%-5s \n " , $popularity ) ; }
print "\n \n HTML Page containing information on my Team:\n \n " ;
print "<title>My Team</title>" ; print "<H1>Sport Activity Teams</H1>\n " ; print "<table border=1>\n " ; print "<tr><th>Team</th><th>Year</th><th>Owner</th><th>Leader</th><th>Famous</th><th>Popularity</th></tr>\n " ;
$yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$leader = $myTeams { $teamName } { 'leader' } ;
$famous = $myTeams { $teamName } { 'famous' } ;
$popularity = $myTeams { $teamName } { 'popularity' } ;
print "<tr><td>$teamName</td><td>$yearBorn</td><td>$owner</td><td>$leader</td><td>$famous</td><td>$popularity</td></tr>\n " ; }
IyEvdXNyL2Jpbi9wZXJsCiMgUGVybCBBc3NpZ25tZW50IC0gSGFzaCBvZiBIYXNoZXMKIyBKIFN0dWRlbnQKCiMgVGVhbXMgdXNpbmcgYSBIYXNoIG9mIEhhc2hlcwoKIyBTcG9ydCBBY3Rpdml0eSBUZWFtcyAgICAgICAgWWVhciAgICAgICAgICBPd25lciAgICAgICAgICAgICAgICAgICAgIExlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBGYW1vdXMgICAgICAgICAgICAgUG9wdWxhcml0eQoKIyBCYWRtaW50b24gICAgICAgICAgICAgICAgICAgMTkzNCAgICAgIER1a2Ugb2YgQmVhdWZvcnQgICAgICAgUG91bC1FcmlrIEjDuHllciBMYXJzZW4gICAgICAgICAgICAgICAgTGluIERhbiAgICAgICAgICAgIDIyMCwwMDAsMDAwCiMgR29sZiAgICAgICAgICAgICAgICAgICAgICAgIDE4OTQgICAgICAgUEdBIG9mIEFtZXJpY2EgICBQcm9mZXNzaW9uYWwgR29sZmVycycgQXNzb2NpYXRpb24gICAgICAgIFRpZ2VyIFdvb2RzICAgICAgICAgIDY2LDYwMCwwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFlvZ2EgICAgICAgICAgICAgICAgICAgICAgICAxOTc1ICAgICAgICAgUGF0YW5qYWxpICAgICAgICAgICAgICAgICAgR3VydWppICAgICAgICAgICAgICAgICAgUGFyYW1hbmhhbnNhIFlvZ2FuYW5kYSAgICAzMDAsMDAwLDAwMAojIFJ1bm5pbmcgICAgICAgICAgICAgICAgICAgICAxOTY3ICAgICAgIEFuY2llbnQgR3JlZWNlICAgICBSdW5uaW5nIEluZHVzdHJ5IEFzc29jaWF0aW9uICAgICAgICAgIERlYW4gS2FybmF6ZXMgICAgICAgICA2MCwwMDAsMDAwCiMgQm93bGluZyAgICAgICAgICAgICAgICAgICAgIDE5ODggICAgIFVTIEJvd2xpbmcgQ29uZ3Jlc3MgICAgIFdhbHRlciBSYXkgV2lsbGlhbXMgSnIgICAgICAgICAgICAgRWFybCBBbnRob255ICAgICAgICAgIDEwMCwwMDAsMDAwCgojIEkgaGF2ZSBjcmVhdGVkIHRoZSBmb2xsb3dpbmcgYXJyYXk6CgpAdGVhbXMgPSAoIkJhZG1pbnRvbiIsICJHb2xmIiwgIllvZ2EiLCAiUnVubmluZyIgLCAiQm93bGluZyIpOwoKIyBhbmQgdGhlIGZvbGxvd2luZyBIYXNoIG9mIEhhc2hlczoKCiVteVRlYW1zID0gKCAiQmFkbWludG9uIiA9PiB7IHllYXJCb3JuID0+IDE5MzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyID0+ICJEdWtlIG9mIEJlYXVmb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJQb3VsLUVyaWsgSMO4eWVyIExhcnNlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbW91cyA9PiAiTGluIERhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXJpdHkgPT4gIjIyME0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAiR29sZiIgPT4geyB5ZWFyQm9ybiA9PiAxODk0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiUEdBIG9mIEFtZXJpY2EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkZXIgPT4gIlByb2Zlc3Npb25hbCBHb2xmZXJzJyBBc3NvY2lhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbW91cyA9PiAiVGlnZXIgV29vZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGFyaXR5ID0+ICI2Nk0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAiWW9nYSIgPT4geyB5ZWFyQm9ybiA9PiAxOTc1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiUGF0YW5qYWxpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJHdXJ1amkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1vdXMgPT4gIlBhcmFtYW5oYW5zYSBZb2dhbmFuZGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGFyaXR5ID0+ICIzMDBNIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIlJ1bm5pbmciID0+IHsgeWVhckJvcm4gPT4gMTk2NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIkFuY2llbnQgR3JlZWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJSdW5uaW5nIEluZHVzdHJ5IEFzc29jaWF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtb3VzID0+ICJEZWFuIEthcm5hemVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhcml0eSA9PiAiNjBNIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJCb3dsaW5nIiA9PiB7IHllYXJCb3JuID0+IDE5ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyID0+ICJVUyBCb3dsaW5nIENvbmdyZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJXYWx0ZXIgUmF5IFdpbGxpYW1zIEpyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtb3VzID0+ICJFYXJsIEFudGhvbnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGFyaXR5ID0+ICIxMDBNIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCik7CgojIFRvIHByaW50IG91dCBzb3J0ZWQgVGVhbSBpbmZvcm1hdGlvbiBpbiB0aGUgSGFzaCBvZiBIYXNoZXMgKGFzY2VuZGluZyBvcmRlcik6CgpwcmludCAoIlxuXG5NeSBUZWFtIC0gc29ydGVkIGJ5IFRlYW0gTmFtZSBhc2NlbmRpbmc6XG5cbiIpOwoKcHJpbnRmKCIlLTEwcyBcdCUtNnMgXHQlLTIwcyBcdCUtMzBzIFx0JS0xOXMgXHQlLTEwcyIsICJUZWFtIiwgIlllYXIiLCAiT3duZXIiLCAiTGVhZGVyIiwgIkZhbW91cyIsICJQb3B1bGFyaXR5Iik7CgpAc29ydGVkS2V5cyA9IHNvcnQgKEB0ZWFtcyk7Cgpmb3IgJHRlYW1OYW1lIChAc29ydGVkS2V5cykgewogICAgJHllYXJCb3JuID0gJG15VGVhbXN7JHRlYW1OYW1lfXsneWVhckJvcm4nfTsKICAgICRvd25lciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J293bmVyJ307CiAgICAkbGVhZGVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnbGVhZGVyJ307CiAgICAkZmFtb3VzID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnZmFtb3VzJ307CiAgICAkcG9wdWxhcml0eSA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J3BvcHVsYXJpdHknfTsKCiAgICBwcmludGYoIiUtMTBzIFx0JS02cyBcdCUtMjBzIFx0JS0zMHMgXHQlLTE5cyBcdCUtMTBzIFxuIiwgJHRlYW1OYW1lLCAkeWVhckJvcm4sICRvd25lciwgJGxlYWRlciwgJGZhbW91cywgJHBvcHVsYXJpdHkpOwogICAgcHJpbnQgIlxuIjsKfQoKIyBUbyBwcmludCBvdXQgc29ydGVkIFRlYW0gaW5mb3JtYXRpb24gaW4gdGhlIEhhc2ggb2YgSGFzaGVzIChkZXNjZW5kaW5nIG9yZGVyKToKCnByaW50ICgiXG5cTXkgVGVhbSAtIHNvcnRlZCBieSBUZWFtIE5hbWUgZGVjZW5kaW5nOlxuXG4iKTsKCnByaW50ZigiJS0xMHMgXHQlLTEwcyBcdCUtMTBzIFx0JS0xMHMgXHQlLTEwcyBcdCUtMTBzIFxuIiwgIlRlYW0iLCAiWWVhciIsICJPd25lciIpOwoKQHJldmVyc2VLZXlzID0gcmV2ZXJzZSAoQHNvcnRlZEtleXMpOwoKZm9yICR0ZWFtTmFtZSAoQHJldmVyc2VLZXlzKSB7CiAgICAkeWVhckJvcm4gPSAkbXlUZWFtc3skdGVhbU5hbWV9eyd5ZWFyQm9ybid9OwogICAgJG93bmVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnb3duZXInfTsKICAgIAogICAgcHJpbnRmKCIlLTEwcyBcdCUtMTBzIFx0JS0xMHMgXG4iLCAkdGVhbU5hbWUsICR5ZWFyQm9ybiwgJG93bmVyKTsKICAgIHByaW50ICJcbiI7CiAgICAKfQoKICAgIHByaW50ZigiXHQlLTVzIFxuIiwgIkxlYWRlciIpOwpmb3IgJHRlYW1OYW1lIChAcmV2ZXJzZUtleXMpIHsKICAgICRsZWFkZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydsZWFkZXInfTsKICAgIAogICAgcHJpbnRmKCIlLTVzIFxuIiwgJGxlYWRlcik7CiAgICBwcmludCAiXG4iOwp9CgogICAgcHJpbnRmKCJcdCUtNXMgXG4iLCAiRmFtb3VzIik7CmZvciAkdGVhbU5hbWUgKEByZXZlcnNlS2V5cykgewogICAgJGZhbW91cyA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2ZhbW91cyd9OwogICAgCiAgICBwcmludGYoIiUtNXMgXG4iLCAkZmFtb3VzKTsKICAgIHByaW50ICJcbiI7Cn0KCnByaW50ZigiXHQlLTVzIFxuIiwgIlBvcHVsYXJpdHkiKTsKZm9yICR0ZWFtTmFtZSAoQHJldmVyc2VLZXlzKSB7CiAgJHBvcHVsYXJpdHkgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydwb3B1bGFyaXR5J307CiAgCiAgICBwcmludGYoIiUtNXMgXG4iLCAkcG9wdWxhcml0eSk7CiAgICBwcmludCAiXG4iOwp9CiAgICAKCnByaW50ICJcblxuSFRNTCBQYWdlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gbXkgVGVhbTpcblxuIjsKCnByaW50ICI8aHRtbD5cbiI7CnByaW50ICI8aGVhZD5cbiI7CnByaW50ICI8dGl0bGU+TXkgVGVhbTwvdGl0bGU+IjsKcHJpbnQgIjwvaGVhZD5cbiI7CnByaW50ICI8Ym9keT5cbiI7CnByaW50ICI8SDE+U3BvcnQgQWN0aXZpdHkgVGVhbXM8L0gxPlxuIjsKcHJpbnQgIjx0YWJsZSBib3JkZXI9MT5cbiI7CnByaW50ICI8dHI+PHRoPlRlYW08L3RoPjx0aD5ZZWFyPC90aD48dGg+T3duZXI8L3RoPjx0aD5MZWFkZXI8L3RoPjx0aD5GYW1vdXM8L3RoPjx0aD5Qb3B1bGFyaXR5PC90aD48L3RyPlxuIjsKCmZvciAkdGVhbU5hbWUgKHNvcnQga2V5cyAlbXlUZWFtcyApIHsKICAgICR5ZWFyQm9ybiA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J3llYXJCb3JuJ307CiAgICAkb3duZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydvd25lcid9OwogICAgJGxlYWRlciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2xlYWRlcid9OwogICAgJGZhbW91cyA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2ZhbW91cyd9OwogICAgJHBvcHVsYXJpdHkgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydwb3B1bGFyaXR5J307CgogICAgcHJpbnQgIjx0cj48dGQ+JHRlYW1OYW1lPC90ZD48dGQ+JHllYXJCb3JuPC90ZD48dGQ+JG93bmVyPC90ZD48dGQ+JGxlYWRlcjwvdGQ+PHRkPiRmYW1vdXM8L3RkPjx0ZD4kcG9wdWxhcml0eTwvdGQ+PC90cj5cbiI7Cn0KcHJpbnQgIjwvdGFibGU+XG4iOwpwcmludCAiPC9ib2R5PlxuIjsKcHJpbnQgIjwvaHRtbD5cbiI7