sub foo { my @names = @_; ... ; return @values if wantarray; return $values[0]; } #### my @ids = ...; my %foo; @foo{@ids} = foo(@ids); #### sub zip { my ($x, $y) = @_; map { $x->[$_], $y->[$_] } 0 .. max($#$x, $#$y); } my @ids = ... ; my %foo = zip(\@ids => [ foo(@ids) ]); #### my @ids = ... ; my @foo = map foo($_) => @ids; my %foo = map { $_ => foo($_) } @ids;