#!/usr/bin/perl
# Perl Assignment - Hash of Hashes
# J Student
# 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 " ; }
IyEvdXNyL2Jpbi9wZXJsCgojIFBlcmwgQXNzaWdubWVudCAtIEhhc2ggb2YgSGFzaGVzCiMgSiBTdHVkZW50CiMgVGVhbXMgdXNpbmcgYSBIYXNoIG9mIEhhc2hlcwoKIyBGb3JtdWxhIDEgVGVhbSAgICAgICAgICBZZWFyICAgIE93bmVyL1BhcmVudCBDb21wYW55ICAgIFRlYW0gUHJpbmNpcGFsICAgIENvdW50cnkgICAgICBDaGFtcGlvbnNoaXBzCiMgTWVyY2VkZXMgICAgICAgICAgICAgICAgMTk3MCAgICBNZXJjZWRlcy1CZW56ICAgICAgICAgIFRvdG8gV29sZmYgICAgICAgIEdlcm1hbnkgICAgICA4CiMgRmVycmFyaSAgICAgICAgICAgICAgICAgMTk1MCAgICBGZXJyYXJpIE4uVi4gICAgICAgICAgIEZyZWRlcmljIFZhc3NldXIgIEl0YWx5ICAgICAgICAxNgojIFJlZCBCdWxsIFJhY2luZyAgICAgICAgIDIwMDUgICAgUmVkIEJ1bGwgR21iSCAgICAgICAgICBDaHJpc3RpYW4gSG9ybmVyICBBdXN0cmlhICAgICAgNgojIE1jTGFyZW4gICAgICAgICAgICAgICAgIDE5NjYgICAgTWNMYXJlbiBHcm91cCAgICAgICAgICBaYWsgQnJvd24gICAgICAgICBVbml0ZWQgS2luZ2RvbSA4CiMgQWxwaW5lICAgICAgICAgICAgICAgICAgMTk4MSAgICBSZW5hdWx0IEdyb3VwICAgICAgICAgIEJydW5vIEZhbWluICAgICAgIEZyYW5jZSAgICAgICAyCgojIEkgaGF2ZSBjcmVhdGVkIHRoZSBmb2xsb3dpbmcgYXJyYXk6CkB0ZWFtcyA9ICgiTWVyY2VkZXMiLCAiRmVycmFyaSIsICJSZWQgQnVsbCBSYWNpbmciLCAiTWNMYXJlbiIsICJBbHBpbmUiKTsKCiMgYW5kIHRoZSBmb2xsb3dpbmcgSGFzaCBvZiBIYXNoZXM6CiVteVRlYW1zID0gKCAiTWVyY2VkZXMiID0+IHsgeWVhckJvcm4gPT4gMTk3MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyID0+ICJNZXJjZWRlcy1CZW56IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRlciA9PiAiVG90byBXb2xmZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0+ICJHZXJtYW55IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW1waW9uc2hpcHMgPT4gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIkZlcnJhcmkiID0+IHsgeWVhckJvcm4gPT4gMTk1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIkZlcnJhcmkgTi5WLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRlciA9PiAiRnJlZGVyaWMgVmFzc2V1ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPT4gIkl0YWx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbXBpb25zaGlwcyA9PiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAiUmVkIEJ1bGwgUmFjaW5nIiA9PiB7IHllYXJCb3JuID0+IDIwMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIlJlZCBCdWxsIEdtYkgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRlciA9PiAiQ2hyaXN0aWFuIEhvcm5lciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9PiAiQXVzdHJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbXBpb25zaGlwcyA9PiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIk1jTGFyZW4iID0+IHsgeWVhckJvcm4gPT4gMTk2NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPT4gIk1jTGFyZW4gR3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkZXIgPT4gIlphayBCcm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPT4gIlVuaXRlZCBLaW5nZG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbXBpb25zaGlwcyA9PiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICJBbHBpbmUiID0+IHsgeWVhckJvcm4gPT4gMTk4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9PiAiUmVuYXVsdCBHcm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZGVyID0+ICJCcnVubyBGYW1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9PiAiRnJhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFtcGlvbnNoaXBzID0+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgKTsKCiMgVG8gcHJpbnQgb3V0IHNvcnRlZCBUZWFtIGluZm9ybWF0aW9uIGluIHRoZSBIYXNoIG9mIEhhc2hlcyAoYXNjZW5kaW5nIG9yZGVyKToKcHJpbnQgKCJcblxuTXkgVGVhbSAtIHNvcnRlZCBieSBUZWFtIE5hbWUgYXNjZW5kaW5nOlxuXG4iKTsKcHJpbnRmKCIlLTIwcyBcdCUtNnMgXHQlLTE1cyBcdCUtMjBzIFx0JS0xNXMgXHQlLTZzIFxuIiwgIlRlYW0iLCAiWWVhciIsICJPd25lciIsICJMZWFkZXIiLCAiQ291bnRyeSIsICJUaXRsZXMiKTsKQHNvcnRlZEtleXMgPSBzb3J0IChAdGVhbXMpOwpmb3IgJHRlYW1OYW1lIChAc29ydGVkS2V5cykgewogICAgJHllYXJCb3JuID0gJG15VGVhbXN7JHRlYW1OYW1lfXsneWVhckJvcm4nfTsKICAgICRvd25lciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J293bmVyJ307CiAgICAkbGVhZGVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnbGVhZGVyJ307CiAgICAkY291bnRyeSA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2NvdW50cnknfTsKICAgICRjaGFtcGlvbnNoaXBzID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY2hhbXBpb25zaGlwcyd9OwogICAgcHJpbnRmKCIlLTIwcyBcdCUtNmkgXHQlLTE1cyBcdCUtMjBzIFx0JS0xNXMgXHQlLTZpIFxuIiwgJHRlYW1OYW1lLCAkeWVhckJvcm4sICRvd25lciwgJGxlYWRlciwgJGNvdW50cnksICRjaGFtcGlvbnNoaXBzKTsKICAgIHByaW50ICJcbiI7Cn0KCiMgVG8gcHJpbnQgb3V0IHNvcnRlZCBUZWFtIGluZm9ybWF0aW9uIGluIHRoZSBIYXNoIG9mIEhhc2hlcyAoZGVzY2VuZGluZyBvcmRlcik6CnByaW50ICgiXG5cTXkgVGVhbSAtIHNvcnRlZCBieSBUZWFtIE5hbWUgZGVjZW5kaW5nOlxuXG4iKTsKcHJpbnRmKCIlLTIwcyBcdCUtNnMgXHQlLTE1cyBcdCUtMjBzIFx0JS0xNXMgXHQlLTZzIFxuIiwgIlRlYW0iLCAiWWVhciIsICJPd25lciIsICJMZWFkZXIiLCAiQ291bnRyeSIsICJUaXRsZXMiKTsKQHJldmVyc2VLZXlzID0gcmV2ZXJzZSAoQHNvcnRlZEtleXMpOwpmb3IgJHRlYW1OYW1lIChAcmV2ZXJzZUtleXMpIHsKICAgICR5ZWFyQm9ybiA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J3llYXJCb3JuJ307CiAgICAkb3duZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydvd25lcid9OwogICAgJGxlYWRlciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2xlYWRlcid9OwogICAgJGNvdW50cnkgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjb3VudHJ5J307CiAgICAkY2hhbXBpb25zaGlwcyA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2NoYW1waW9uc2hpcHMnfTsKICAgIAogICAgcHJpbnRmKCIlLTIwcyBcdCUtNmkgXHQlLTE1cyBcdCUtMjBzIFx0JS0xNXMgXHQlLTZpIFxuIiwgJHRlYW1OYW1lLCAkeWVhckJvcm4sICRvd25lciwgJGxlYWRlciwgJGNvdW50cnksICRjaGFtcGlvbnNoaXBzKTsKICAgIHByaW50ICJcbiI7Cn0KCnByaW50ICJcblxuSFRNTCBQYWdlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gbXkgVGVhbTpcblxuIjsKcHJpbnQgIjxodG1sPlxuIjsKcHJpbnQgIjxoZWFkPlxuIjsKcHJpbnQgIjx0aXRsZT5NeSBUZWFtPC90aXRsZT4iOwpwcmludCAiPC9oZWFkPlxuIjsKcHJpbnQgIjxib2R5PlxuIjsKcHJpbnQgIjxIMT5Gb3JtdWxhIDEgUmFjaW5nIFRlYW1zPC9IMT5cbiI7CnByaW50ICI8dGFibGUgYm9yZGVyPTE+XG4iOwpwcmludCAiPHRyPjx0aD5UZWFtPC90aD48dGg+WWVhcjwvdGg+PHRoPk93bmVyPC90aD48dGg+TGVhZGVyPC90aD48dGg+Q291bnRyeTwvdGg+PHRoPkNoYW1waW9uc2hpcHM8L3RoPjwvdHI+XG4iOwpmb3IgJHRlYW1OYW1lIChzb3J0IGtleXMgJW15VGVhbXMgKSB7CiAgICAkeWVhckJvcm4gPSAkbXlUZWFtc3skdGVhbU5hbWV9eyd5ZWFyQm9ybid9OwogICAgJG93bmVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnb3duZXInfTsKICAgICRsZWFkZXIgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydsZWFkZXInfTsKICAgICRjb3VudHJ5ID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY291bnRyeSd9OwogICAgJGNoYW1waW9uc2hpcHMgPSAkbXlUZWFtc3skdGVhbU5hbWV9eydjaGFtcGlvbnNoaXBzJ307CiAgICBwcmludCAiPHRyPjx0ZD4kdGVhbU5hbWU8L3RkPjx0ZD4keWVhckJvcm48L3RkPjx0ZD4kb3duZXI8L3RkPjx0ZD4kbGVhZGVyPC90ZD48dGQ+JGNvdW50cnk8L3RkPjx0ZD4kY2hhbXBpb25zaGlwczwvdGQ+PC90cj5cbiI7Cn0KcHJpbnQgIjwvdGFibGU+XG4iOwpwcmludCAiPC9ib2R5PlxuIjsKcHJpbnQgIjwvaHRtbD5cbiI7CgpwcmludCAiXG5cblhNTCBmaWxlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gbXkgVGVhbSAtIGJ5IFRlYW0gTmFtZSBhc2NlbmRpbmc6XG5cbiI7CnByaW50ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuIjsKcHJpbnQgIjx0ZWFtcz5cbiI7CmZvciAkdGVhbU5hbWUgKHNvcnQga2V5cyAlbXlUZWFtcyApIHsKICAgIHByaW50ICIgPHRlYW0+XG4iOwogICAgJHllYXJCb3JuID0gJG15VGVhbXN7JHRlYW1OYW1lfXsneWVhckJvcm4nfTsKICAgICRvd25lciA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J293bmVyJ307CiAgICAkbGVhZGVyID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnbGVhZGVyJ307CiAgICAkY291bnRyeSA9ICRteVRlYW1zeyR0ZWFtTmFtZX17J2NvdW50cnknfTsKICAgICRjaGFtcGlvbnNoaXBzID0gJG15VGVhbXN7JHRlYW1OYW1lfXsnY2hhbXBpb25zaGlwcyd9OwogICAgCiAgICBwcmludCAiIDx0ZWFtTmFtZT4kdGVhbU5hbWU8L3RlYW1OYW1lPlxuIjsKICAgIHByaW50ICIgPHllYXJCb3JuPiR5ZWFyQm9ybjwveWVhckJvcm4+XG4iOwogICAgcHJpbnQgIiA8b3duZXI+JG93bmVyPC9vd25lcj5cbiI7CiAgICBwcmludCAiIDxsZWFkZXI+JGxlYWRlcjwvbGVhZGVyPlxuIjsKICAgIHByaW50ICIgPGNvdW50cnk+JGNvdW50cnk8L2NvdW50cnk+XG4iOwogICAgcHJpbnQgIiA8Y2hhbXBpb25zaGlwcz4kY2hhbXBpb25zaGlwczwvY2hhbXBpb25zaGlwcz5cbiI7CiAgICBwcmludCAiIDwvdGVhbT5cbiI7Cn0KcHJpbnQgIjwvdGVhbXM+XG4iOw==