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];