in reply to Returning a hash instead of two arrays help!

There are lots of ways this could go and a best answer depends a lot on the bigger picture. In the context of the narrow picture shown using a hash slice or two is the easy way to populate a hash:

use strict; use warnings; my $info = test(); for my $name (sort keys %$info) { printf "%-10s %s\n", "$name:", $info->{$name}; } sub test { my (@names_all, @email_all); my @names = qw(Joe mary ann pete amy jerry); my @email = qw(joe@test.com mary@test.com ann@nowhere.com pete@here.com amy@ok.com jerry@b.com); my %emails; @emails{@names_all} = @email_all; @emails{@names} = @email; return \%emails; }

Prints:

Joe: joe@test.com amy: amy@ok.com ann: ann@nowhere.com jerry: jerry@b.com mary: mary@test.com pete: pete@here.com
True laziness is hard work

Replies are listed 'Best First'.
Re^2: Returning a hash instead of two arrays help!
by Anonymous Monk on Jul 31, 2012 at 13:33 UTC
    Hi, I hope someone will get to this still, I have a similar problem and my question is, what if some of these elements are repeated what would be the best way to return these values?
    use strict; use warnings; my $info = test(); for my $name (sort keys %$info) { printf "%-10s %s\n", "$name:", $info->{$name}; } sub test { my (@names_all, @email_all); my @names = qw(Joe mary ann pete amy jerry Joe ann); my @email = qw(joe@test.com mary@test.com ann@nowhere.com pete@here.com amy@ok.com jerry@b.com joe@test.com ann@nowhere. +com); my %emails; @emails{@names_all} = @email_all; @emails{@names} = @email; return \%emails; }

    Thanks!

      It depends on why you have "repeated elements". If you have multiple people with the same name then you probably need to use an ID code as the hash key instead of the name. If you have multiple email addresses per person then the value becomes an array instead of a single value and you can thus track all the addresses.

      True laziness is hard work