use warnings; use strict; my %formal_name = ( bill => 'william', will => 'william', abe => 'abraham' ); print_formal_name('will'); print_formal_name('sam'); print_all_nicknames('wiLLiam'); print_all_nicknames('thomas'); sub print_formal_name { my $nickname = shift; if (exists $formal_name{lc $nickname}) { print "The formal name for $nickname is ", ucfirst $formal_name{lc $nickname}, ".\n"; } else { print "There is no formal name for $nickname.\n"; } } sub print_all_nicknames { my $formalname = shift; my @nicknames; for my $nickname (keys %formal_name) { if ($formal_name{$nickname} eq lc $formalname) { push @nicknames, ucfirst $nickname . ', '; } } if (@nicknames) { $nicknames[$#nicknames] =~ s/, //; print ucfirst lc $formalname, " has these nicknames: ", @nicknames, ".\n"; } else { print ucfirst lc $formalname, " has no nicknames.\n"; } } #### The formal name for will is William. There is no formal name for sam. William has these nicknames: Will, Bill. Thomas has no nicknames.