my %EMail = ( Category1 => { "Name One", 'some1@address.com', }, Category2 => { "Name Two", 'some2@address.com', "Name Three", 'some3@address.com', }, Category3 => { "Name Four", 'some4@address.com', "Name Five", 'some5@address.com', "Name Six", 'some6@address.com', "Name Seven", 'some7@address.com', "Name Eight", 'some8@address.com', }, ); @EMail{keys %{$EMail{$_}}}= values %{$EMail{$_}} for keys %EMail; sub GetEMailFor { my @addresses= (); for my $dest (@_) { my $addr= $EMail{$dest} or die "No such e-mail destination: $dest\n"; push @addresses, ref($addr) ? values %$addr : $addr; } return join ',', reverse @addresses; }