#!/usr/bin/perl
# Perl Assignment - Hash of Hashes
# Kevin Perry
# Teams using a Hash of Hashes
# Formula 1 Team Year Owner/Parent Company Team Principal Country Championships
# Mercedes 1970 Mercedes-Benz Toto Wolff Germany 8
# Ferrari 1950 Ferrari N.V. Frederic Vasseur Italy 16
# Red Bull Racing 2005 Red Bull GmbH Christian Horner Austria 6
# McLaren 1966 McLaren Group Zak Brown United Kingdom 8
# Alpine 1981 Renault Group Bruno Famin France 2
# I have created the following array:
@teams = ( "Mercedes" , "Ferrari" , "Red Bull Racing" , "McLaren" , "Alpine" ) ;
# and the following Hash of Hashes:
%myTeams = ( "Mercedes" => { yearBorn => 1970 ,
owner => "Mercedes-Benz" ,
leader => "Toto Wolff" ,
country => "Germany" ,
championships => 8 ,
} ,
"Ferrari" => { yearBorn => 1950 ,
owner => "Ferrari N.V." ,
leader => "Frederic Vasseur" ,
country => "Italy" ,
championships => 16 ,
} ,
"Red Bull Racing" => { yearBorn => 2005 ,
owner => "Red Bull GmbH" ,
leader => "Christian Horner" ,
country => "Austria" ,
championships => 6 ,
} ,
"McLaren" => { yearBorn => 1966 ,
owner => "McLaren Group" ,
leader => "Zak Brown" ,
country => "United Kingdom" ,
championships => 8 ,
} ,
"Alpine" => { yearBorn => 1981 ,
owner => "Renault Group" ,
leader => "Bruno Famin" ,
country => "France" ,
championships => 2 ,
} ,
) ;
# 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 %-6s \t %-15s \t %-20s \t %-15s \t %-6s \n " , "Team" , "Year" , "Owner" , "Leader" , "Country" , "Titles" ) ; @sortedKeys = sort ( @teams ) ; for $teamName ( @sortedKeys ) {
$yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$leader = $myTeams { $teamName } { 'leader' } ;
$country = $myTeams { $teamName } { 'country' } ;
$championships = $myTeams { $teamName } { 'championships' } ;
printf ( "%-20s \t %-6i \t %-15s \t %-20s \t %-15s \t %-6i \n " , $teamName , $yearBorn , $owner , $leader , $country , $championships ) ; }
# 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 %-15s \t %-20s \t %-15s \t %-6s \n " , "Team" , "Year" , "Owner" , "Leader" , "Country" , "Titles" ) ; @reverseKeys = reverse ( @sortedKeys ) ; for $teamName ( @reverseKeys ) {
$yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$leader = $myTeams { $teamName } { 'leader' } ;
$country = $myTeams { $teamName } { 'country' } ;
$championships = $myTeams { $teamName } { 'championships' } ;
printf ( "%-20s \t %-6i \t %-15s \t %-20s \t %-15s \t %-6i \n " , $teamName , $yearBorn , $owner , $leader , $country , $championships ) ; }
print "\n \n HTML Page containing information on my Team:\n \n " ; print "<title>My Team</title>" ; print "<H1>Formula 1 Racing Teams</H1>\n " ; print "<table border=1>\n " ; print "<tr><th>Team</th><th>Year</th><th>Owner</th><th>Leader</th><th>Country</th><th>Championships</th></tr>\n " ; $yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$leader = $myTeams { $teamName } { 'leader' } ;
$country = $myTeams { $teamName } { 'country' } ;
$championships = $myTeams { $teamName } { 'championships' } ;
print "<tr><td>$teamName</td><td>$yearBorn</td><td>$owner</td><td>$leader</td><td>$country</td><td>$championships</td></tr>\n " ; }
print "\n \n XML file containing information on my Team - by Team Name ascending:\n \n " ; print "<?xml version=\" 1.0\" ?>\n " ; $yearBorn = $myTeams { $teamName } { 'yearBorn' } ;
$owner = $myTeams { $teamName } { 'owner' } ;
$leader = $myTeams { $teamName } { 'leader' } ;
$country = $myTeams { $teamName } { 'country' } ;
$championships = $myTeams { $teamName } { 'championships' } ;
print " <teamName>$teamName</teamName>\n " ; print " <yearBorn>$yearBorn</yearBorn>\n " ; print " <owner>$owner</owner>\n " ; print " <leader>$leader</leader>\n " ; print " <country>$country</country>\n " ; print " <championships>$championships</championships>\n " ; }
IyEvdXNyL2Jpbi9wZXJsCgojIFBlcmwgQXNzaWdubWVudCAtIEhhc2ggb2YgSGFzaGVzCiMgS2V2aW4gUGVycnkKIyBUZWFtcyB1c2luZyBhIEhhc2ggb2YgSGFzaGVzCgojIEZvcm11bGEgMSBUZWFtICAgICAgICAgIFllYXIgICAgT3duZXIvUGFyZW50IENvbXBhbnkgICAgVGVhbSBQcmluY2lwYWwgICAgQ291bnRyeSAgICAgIENoYW1waW9uc2hpcHMKIyBNZXJjZWRlcyAgICAgICAgICAgICAgICAxOTcwICAgIE1lcmNlZGVzLUJlbnogICAgICAgICAgVG90byBXb2xmZiAgICAgICAgR2VybWFueSAgICAgIDgKIyBGZXJyYXJpICAgICAgICAgICAgICAgICAxOTUwICAgIEZlcnJhcmkgTi5WLiAgICAgICAgICAgRnJlZGVyaWMgVmFzc2V1ciAgSXRhbHkgICAgICAgIDE2CiMgUmVkIEJ1bGwgUmFjaW5nICAgICAgICAgMjAwNSAgICBSZWQgQnVsbCBHbWJIICAgICAgICAgIENocmlzdGlhbiBIb3JuZXIgIEF1c3RyaWEgICAgICA2CiMgTWNMYXJlbiAgICAgICAgICAgICAgICAgMTk2NiAgICBNY0xhcmVuIEdyb3VwICAgICAgICAgIFphayBCcm93biAgICAgICAgIFVuaXRlZCBLaW5nZG9tIDgKIyBBbHBpbmUgICAgICAgICAgICAgICAgICAxOTgxICAgIFJlbmF1bHQgR3JvdXAgICAgICAgICAgQnJ1bm8gRmFtaW4gICAgICAgRnJhbmNlICAgICAgIDIKCiMgSSBoYXZlIGNyZWF0ZWQgdGhlIGZvbGxvd2luZyBhcnJheToKQHRlYW1zID0gKCJNZXJjZWRlcyIsICJGZXJyYXJpIiwgIlJlZCBCdWxsIFJhY2luZyIsICJNY0xhcmVuIiwgIkFscGluZSIpOwoKIyBhbmQgdGhlIGZvbGxvd2luZyBIYXNoIG9mIEhhc2hlczoKJW15VGVhbXMgPSAoICJNZXJjZWRlcyIgPT4geyB5ZWFyQm9ybiA9PiAxOTcwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIk1lcmNlZGVzLUJlbnoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJUb3RvIFdvbGZmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPT4gIkdlcm1hbnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbXBpb25zaGlwcyA9PiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAiRmVycmFyaSIgPT4geyB5ZWFyQm9ybiA9PiAxOTUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiRmVycmFyaSBOLlYuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJGcmVkZXJpYyBWYXNzZXVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9PiAiSXRhbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcGlvbnNoaXBzID0+IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICJSZWQgQnVsbCBSYWNpbmciID0+IHsgeWVhckJvcm4gPT4gMjAwNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiUmVkIEJ1bGwgR21iSCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJDaHJpc3RpYW4gSG9ybmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0+ICJBdXN0cmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcGlvbnNoaXBzID0+IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAiTWNMYXJlbiIgPT4geyB5ZWFyQm9ybiA9PiAxOTY2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiTWNMYXJlbiBHcm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRlciA9PiAiWmFrIEJyb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9PiAiVW5pdGVkIEtpbmdkb20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcGlvbnNoaXBzID0+IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIkFscGluZSIgPT4geyB5ZWFyQm9ybiA9PiAxOTgxLAogICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyID0+ICJSZW5hdWx0IEdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkZXIgPT4gIkJydW5vIEZhbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0+ICJGcmFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW1waW9uc2hpcHMgPT4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICApOwoKIyBUbyBwcmludCBvdXQgc29ydGVkIFRlYW0gaW5mb3JtYXRpb24gaW4gdGhlIEhhc2ggb2YgSGFzaGVzIChhc2NlbmRpbmcgb3JkZXIpOgpwcmludCAoIlxuXG5NeSBUZWFtIC0gc29ydGVkIGJ5IFRlYW0gTmFtZSBhc2NlbmRpbmc6XG5cbiIpOwpwcmludGYoIiUtMjBzIFx0JS02cyBcdCUtMTVzIFx0JS0yMHMgXHQlLTE1cyBcdCUtNnMgXG4iLCAiVGVhbSIsICJZZWFyIiwgIk93bmVyIiwgIkxlYWRlciIsICJDb3VudHJ5IiwgIlRpdGxlcyIpOwpAc29ydGVkS2V5cyA9IHNvcnQgKEB0ZWFtcyk7CmZvciAkdGVhbU5hbWUgKEBzb3J0ZWRLZXlzKSB7CiAgICAkeWVhckJvcm4gPSAkbXlUZWFtc3skdGVhbU5hbWV9eyd5ZWFyQm9ybid9OwogICAgJG93bmVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnb3duZXInfTsKICAgICRsZWFkZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydsZWFkZXInfTsKICAgICRjb3VudHJ5ID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY291bnRyeSd9OwogICAgJGNoYW1waW9uc2hpcHMgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjaGFtcGlvbnNoaXBzJ307CiAgICBwcmludGYoIiUtMjBzIFx0JS02aSBcdCUtMTVzIFx0JS0yMHMgXHQlLTE1cyBcdCUtNmkgXG4iLCAkdGVhbU5hbWUsICR5ZWFyQm9ybiwgJG93bmVyLCAkbGVhZGVyLCAkY291bnRyeSwgJGNoYW1waW9uc2hpcHMpOwogICAgcHJpbnQgIlxuIjsKfQoKIyBUbyBwcmludCBvdXQgc29ydGVkIFRlYW0gaW5mb3JtYXRpb24gaW4gdGhlIEhhc2ggb2YgSGFzaGVzIChkZXNjZW5kaW5nIG9yZGVyKToKcHJpbnQgKCJcblxNeSBUZWFtIC0gc29ydGVkIGJ5IFRlYW0gTmFtZSBkZWNlbmRpbmc6XG5cbiIpOwpwcmludGYoIiUtMjBzIFx0JS02cyBcdCUtMTVzIFx0JS0yMHMgXHQlLTE1cyBcdCUtNnMgXG4iLCAiVGVhbSIsICJZZWFyIiwgIk93bmVyIiwgIkxlYWRlciIsICJDb3VudHJ5IiwgIlRpdGxlcyIpOwpAcmV2ZXJzZUtleXMgPSByZXZlcnNlIChAc29ydGVkS2V5cyk7CmZvciAkdGVhbU5hbWUgKEByZXZlcnNlS2V5cykgewogICAgJHllYXJCb3JuID0gJG15VGVhbXN7JHRlYW1OYW1lfXsneWVhckJvcm4nfTsKICAgICRvd25lciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J293bmVyJ307CiAgICAkbGVhZGVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnbGVhZGVyJ307CiAgICAkY291bnRyeSA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2NvdW50cnknfTsKICAgICRjaGFtcGlvbnNoaXBzID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY2hhbXBpb25zaGlwcyd9OwogICAgCiAgICBwcmludGYoIiUtMjBzIFx0JS02aSBcdCUtMTVzIFx0JS0yMHMgXHQlLTE1cyBcdCUtNmkgXG4iLCAkdGVhbU5hbWUsICR5ZWFyQm9ybiwgJG93bmVyLCAkbGVhZGVyLCAkY291bnRyeSwgJGNoYW1waW9uc2hpcHMpOwogICAgcHJpbnQgIlxuIjsKfQoKcHJpbnQgIlxuXG5IVE1MIFBhZ2UgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiBteSBUZWFtOlxuXG4iOwpwcmludCAiPGh0bWw+XG4iOwpwcmludCAiPGhlYWQ+XG4iOwpwcmludCAiPHRpdGxlPk15IFRlYW08L3RpdGxlPiI7CnByaW50ICI8L2hlYWQ+XG4iOwpwcmludCAiPGJvZHk+XG4iOwpwcmludCAiPEgxPkZvcm11bGEgMSBSYWNpbmcgVGVhbXM8L0gxPlxuIjsKcHJpbnQgIjx0YWJsZSBib3JkZXI9MT5cbiI7CnByaW50ICI8dHI+PHRoPlRlYW08L3RoPjx0aD5ZZWFyPC90aD48dGg+T3duZXI8L3RoPjx0aD5MZWFkZXI8L3RoPjx0aD5Db3VudHJ5PC90aD48dGg+Q2hhbXBpb25zaGlwczwvdGg+PC90cj5cbiI7CmZvciAkdGVhbU5hbWUgKHNvcnQga2V5cyAlbXlUZWFtcyApIHsKICAgICR5ZWFyQm9ybiA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J3llYXJCb3JuJ307CiAgICAkb3duZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydvd25lcid9OwogICAgJGxlYWRlciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2xlYWRlcid9OwogICAgJGNvdW50cnkgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjb3VudHJ5J307CiAgICAkY2hhbXBpb25zaGlwcyA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2NoYW1waW9uc2hpcHMnfTsKICAgIHByaW50ICI8dHI+PHRkPiR0ZWFtTmFtZTwvdGQ+PHRkPiR5ZWFyQm9ybjwvdGQ+PHRkPiRvd25lcjwvdGQ+PHRkPiRsZWFkZXI8L3RkPjx0ZD4kY291bnRyeTwvdGQ+PHRkPiRjaGFtcGlvbnNoaXBzPC90ZD48L3RyPlxuIjsKfQpwcmludCAiPC90YWJsZT5cbiI7CnByaW50ICI8L2JvZHk+XG4iOwpwcmludCAiPC9odG1sPlxuIjsKCnByaW50ICJcblxuWE1MIGZpbGUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiBteSBUZWFtIC0gYnkgVGVhbSBOYW1lIGFzY2VuZGluZzpcblxuIjsKcHJpbnQgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4iOwpwcmludCAiPHRlYW1zPlxuIjsKZm9yICR0ZWFtTmFtZSAoc29ydCBrZXlzICVteVRlYW1zICkgewogICAgcHJpbnQgIiA8dGVhbT5cbiI7CiAgICAkeWVhckJvcm4gPSAkbXlUZWFtc3skdGVhbU5hbWV9eyd5ZWFyQm9ybid9OwogICAgJG93bmVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnb3duZXInfTsKICAgICRsZWFkZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydsZWFkZXInfTsKICAgICRjb3VudHJ5ID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY291bnRyeSd9OwogICAgJGNoYW1waW9uc2hpcHMgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjaGFtcGlvbnNoaXBzJ307CiAgICAKICAgIHByaW50ICIgPHRlYW1OYW1lPiR0ZWFtTmFtZTwvdGVhbU5hbWU+XG4iOwogICAgcHJpbnQgIiA8eWVhckJvcm4+JHllYXJCb3JuPC95ZWFyQm9ybj5cbiI7CiAgICBwcmludCAiIDxvd25lcj4kb3duZXI8L293bmVyPlxuIjsKICAgIHByaW50ICIgPGxlYWRlcj4kbGVhZGVyPC9sZWFkZXI+XG4iOwogICAgcHJpbnQgIiA8Y291bnRyeT4kY291bnRyeTwvY291bnRyeT5cbiI7CiAgICBwcmludCAiIDxjaGFtcGlvbnNoaXBzPiRjaGFtcGlvbnNoaXBzPC9jaGFtcGlvbnNoaXBzPlxuIjsKICAgIHByaW50ICIgPC90ZWFtPlxuIjsKfQpwcmludCAiPC90ZWFtcz5cbiI7