# Perl Assignment - Hash of Hashes
# Bill Davern
# Assignment 8
# Teams using a Hash of Hashes
# Sports Team Year Owner Captain Champions Notes
# Justice Society 1940 DC Hawkman
# Justice League 1960 DC Superman
# Fantastic Four 1961 Marvel Mr. Fantastic
# Avengers 1963 Marvel Captain America
# X-Men 1963 Marvel Professor X
# I have created the following array:
@teams = ( "Boston Bruins" , "New England Patriots" , "USA Hockey" , "Boston Celtics" , "Boston Redsox" ) ;
# and the following Hash of Hashes:
%myTeams = ( "Boston Bruins" => { year => 2011 ,
owner => "J. Jacups" ,
captain => "Zdeno Charra" ,
champs => "Yes" ,
notes => "More of a gang then a team!" ,
} ,
"New England Patriots" => { year => 2018 ,
owner => "Kraft" ,
captain => "Tom Brady" ,
champs => "Yes" ,
notes => "Best Comeback Ever!" ,
} ,
"USA Hockey" => { year => 1980 ,
owner => "USA Hockey" ,
captain => "Mike Eruzione" ,
champs => "Yes" ,
notes => "Greatest Sporting event EVER!" ,
} ,
"Boston Celtic" => { year => 2007 ,
owner => "Wyc Grousbeck" ,
captain => "Paul Pierce" ,
champs => "Yes" ,
notes => "Banner 17" ,
} ,
"Boston Redsox" => { year => 2007 ,
owner => "John Henry" ,
captain => "Jason Varitek" ,
champs => "Yes" ,
notes => "Can you say Sweep" ,
} ,
) ;
# 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 ( "%-20s \t %-6i \t %-10s \t %-25s \t %-5 \t %-50 \n " , $teamName , $year , $owner , $captain , $champs , $notes ) ;
@sortedKeys = sort ( @teams ) ;
for $teamName ( @sortedKeys ) {
$year = $myTeams { $teamName } { 'year' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$captain = $myTeams { $teamName } { 'captain' } ;
$champs = $myTeams { $teamName } { 'champs' } ;
$notes = $myTeams { $teamName } { 'notes' } ;
printf ( "%-20s \t %-6i \t %-10s \t %-25s \t %-5s \t %-50s \n " , $teamName , $year , $owner , $captain , $champs , $notes ) ; }
# 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 ( "%-20s \t %-6s \t %-10s \t %-25s \t \n " , "Team" , "Year" , "Owner" , "Captain" ) ;
@reverseKeys = reverse ( @sortedKeys ) ;
for $teamName ( @reverseKeys ) {
$year = $myTeams { $teamName } { 'year' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$captain = $myTeams { $teamName } { 'captain' } ;
printf ( "%-20s \t %-6i \t %-10s \t %-25s \n " , $teamName , $year , $owner , $captain ) ; }
print "\n \n HTML Page containing information on my Team:\n \n " ;
print "<title>My Team</title>" ; print "<H1>SuperHero Teams</H1>\n " ; print "<table border=1>\n " ; print "<tr><th>Team</th><th>Year</th><th>Owner</th><th>Captain</th></tr>\n " ;
$year = $myTeams { $teamName } { 'year' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$captain = $myTeams { $teamName } { 'captain' } ;
print "<tr><td>$teamName</td><td>$year</td><td>$owner</td><td>$captain</td></tr>\n " ; }
IyBQZXJsIEFzc2lnbm1lbnQgLSBIYXNoIG9mIEhhc2hlcwojIEJpbGwgRGF2ZXJuCiMgQXNzaWdubWVudCA4CgojIFRlYW1zIHVzaW5nIGEgSGFzaCBvZiBIYXNoZXMKCiMgU3BvcnRzIFRlYW0gWWVhciBPd25lciBDYXB0YWluIENoYW1waW9ucyBOb3RlcwoKIyBKdXN0aWNlIFNvY2lldHkgIDE5NDAgREMgICAgIEhhd2ttYW4KIyBKdXN0aWNlIExlYWd1ZSAgIDE5NjAgREMgICAgIFN1cGVybWFuCiMgRmFudGFzdGljIEZvdXIgICAxOTYxIE1hcnZlbCBNci4gRmFudGFzdGljCiMgQXZlbmdlcnMgICAgICAgICAxOTYzIE1hcnZlbCBDYXB0YWluIEFtZXJpY2EKIyBYLU1lbiAgICAgICAgICAgIDE5NjMgTWFydmVsIFByb2Zlc3NvciBYCgojIEkgaGF2ZSBjcmVhdGVkIHRoZSBmb2xsb3dpbmcgYXJyYXk6CgpAdGVhbXMgPSAoIkJvc3RvbiBCcnVpbnMiLCAiTmV3IEVuZ2xhbmQgUGF0cmlvdHMiLCAiVVNBIEhvY2tleSIsICJCb3N0b24gQ2VsdGljcyIgLCAiQm9zdG9uIFJlZHNveCIpOwoKIyBhbmQgdGhlIGZvbGxvd2luZyBIYXNoIG9mIEhhc2hlczoKCiVteVRlYW1zID0gKCAiQm9zdG9uIEJydWlucyIgPT4geyB5ZWFyID0+IDIwMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyID0+ICJKLiBKYWN1cHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0YWluID0+ICJaZGVubyBDaGFycmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcHMgPT4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzID0+ICJNb3JlIG9mIGEgZ2FuZyB0aGVuIGEgdGVhbSEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiTmV3IEVuZ2xhbmQgUGF0cmlvdHMiID0+IHsgeWVhciA9PiAyMDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiS3JhZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0YWluID0+ICJUb20gQnJhZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcHMgPT4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzID0+ICJCZXN0IENvbWViYWNrIEV2ZXIhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgIlVTQSBIb2NrZXkiID0+IHsgeWVhciA9PiAxOTgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiVVNBIEhvY2tleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRhaW4gPT4gIk1pa2UgRXJ1emlvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcHMgPT4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzID0+ICJHcmVhdGVzdCBTcG9ydGluZyBldmVudCBFVkVSISIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJCb3N0b24gQ2VsdGljIiA9PiB7IHllYXIgPT4gMjAwNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIld5YyBHcm91c2JlY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0YWluID0+ICJQYXVsIFBpZXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW1wcyA9PiAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZXMgPT4gIkJhbm5lciAxNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICJCb3N0b24gUmVkc294IiA9PiB7IHllYXIgPT4gMjAwNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIkpvaG4gSGVucnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0YWluID0+ICJKYXNvbiBWYXJpdGVrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbXBzID0+ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlcyA9PiAiQ2FuIHlvdSBzYXkgU3dlZXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCik7CgojIFRvIHByaW50IG91dCBzb3J0ZWQgVGVhbSBpbmZvcm1hdGlvbiBpbiB0aGUgSGFzaCBvZiBIYXNoZXMgKGFzY2VuZGluZyBvcmRlcik6CgpwcmludCAoIlxuXG5NeSBUZWFtIC0gc29ydGVkIGJ5IFRlYW0gTmFtZSBhc2NlbmRpbmc6XG5cbiIpOwoKcHJpbnRmKCIlLTIwcyBcdCUtNmkgXHQlLTEwcyBcdCUtMjVzIFx0JS01IFx0JS01MCBcbiIsICR0ZWFtTmFtZSwgJHllYXIsICRvd25lciwgJGNhcHRhaW4sICRjaGFtcHMsICRub3Rlcyk7CgpAc29ydGVkS2V5cyA9IHNvcnQgKEB0ZWFtcyk7Cgpmb3IgJHRlYW1OYW1lIChAc29ydGVkS2V5cykgewogICAgJHllYXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eyd5ZWFyJ307CiAgICAkb3duZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydvd25lcid9OwogICAgJGNhcHRhaW4gPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjYXB0YWluJ307CiAgICAkY2hhbXBzID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY2hhbXBzJ307CiAgICAkbm90ZXMgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydub3Rlcyd9OwoKICAgIHByaW50ZigiJS0yMHMgXHQlLTZpIFx0JS0xMHMgXHQlLTI1cyBcdCUtNXMgXHQlLTUwcyBcbiIsICR0ZWFtTmFtZSwgJHllYXIsICRvd25lciwgJGNhcHRhaW4sICRjaGFtcHMsICRub3Rlcyk7CiAgICBwcmludCAiXG4iOwp9CgojIFRvIHByaW50IG91dCBzb3J0ZWQgVGVhbSBpbmZvcm1hdGlvbiBpbiB0aGUgSGFzaCBvZiBIYXNoZXMgKGRlc2NlbmRpbmcgb3JkZXIpOgoKcHJpbnQgKCJcblxNeSBUZWFtIC0gc29ydGVkIGJ5IFRlYW0gTmFtZSBkZWNlbmRpbmc6XG5cbiIpOwoKcHJpbnRmKCIlLTIwcyBcdCUtNnMgXHQlLTEwcyBcdCUtMjVzIFx0XG4iLCAiVGVhbSIsICJZZWFyIiwgIk93bmVyIiwgIkNhcHRhaW4iKTsKCkByZXZlcnNlS2V5cyA9IHJldmVyc2UgKEBzb3J0ZWRLZXlzKTsKCmZvciAkdGVhbU5hbWUgKEByZXZlcnNlS2V5cykgewogICAgJHllYXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eyd5ZWFyJ307CiAgICAkb3duZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydvd25lcid9OwogICAgJGNhcHRhaW4gPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjYXB0YWluJ307CiAgICAKICAgIHByaW50ZigiJS0yMHMgXHQlLTZpIFx0JS0xMHMgXHQlLTI1cyBcbiIsICR0ZWFtTmFtZSwgJHllYXIsICRvd25lciwgJGNhcHRhaW4pOwogICAgcHJpbnQgIlxuIjsKfQoKcHJpbnQgIlxuXG5IVE1MIFBhZ2UgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiBteSBUZWFtOlxuXG4iOwoKcHJpbnQgIjxodG1sPlxuIjsKcHJpbnQgIjxoZWFkPlxuIjsKcHJpbnQgIjx0aXRsZT5NeSBUZWFtPC90aXRsZT4iOwpwcmludCAiPC9oZWFkPlxuIjsKcHJpbnQgIjxib2R5PlxuIjsKcHJpbnQgIjxIMT5TdXBlckhlcm8gVGVhbXM8L0gxPlxuIjsKcHJpbnQgIjx0YWJsZSBib3JkZXI9MT5cbiI7CnByaW50ICI8dHI+PHRoPlRlYW08L3RoPjx0aD5ZZWFyPC90aD48dGg+T3duZXI8L3RoPjx0aD5DYXB0YWluPC90aD48L3RyPlxuIjsKCmZvciAkdGVhbU5hbWUgKHNvcnQga2V5cyAlbXlUZWFtcyApIHsKICAgICR5ZWFyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsneWVhcid9OwogICAgJG93bmVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnb3duZXInfTsKICAgICRjYXB0YWluID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY2FwdGFpbid9OwoKICAgIHByaW50ICI8dHI+PHRkPiR0ZWFtTmFtZTwvdGQ+PHRkPiR5ZWFyPC90ZD48dGQ+JG93bmVyPC90ZD48dGQ+JGNhcHRhaW48L3RkPjwvdHI+XG4iOwp9CnByaW50ICI8L3RhYmxlPlxuIjsKcHJpbnQgIjwvYm9keT5cbiI7CnByaW50ICI8L2h0bWw+XG4iOwoK