sub unzip(&@) { my $code = shift; my @retlist; while(@_) { local $_ = \@_; push @retlist, $code->(); } return @retlist; } use Data::Dumper; my %h = qw(k1 v1 k2 v2); print Dumper [unzip {[shift @$_,shift @$_]} %h]; #### sub unzip(&\%) { my $code = shift; my %hash = %{shift()}; my @retlist; while(my @list = each %hash) { push @retlist, $code->(@list); } return @retlist; } use Data::Dumper; my %h = qw(k1 v1 k2 v2); print Dumper [unzip {[$_[0], $_[1]]} %h];