my %post_data = map { $_ => param( $_ ) } param; my %url_data = map { $_ => url_param( $_) } url_param; my %data = merge( \%post_data, \%url_data ); sub merge { my %merged; for (@_) { while (my ($key, $value) = each %$_) { push @{$merged{$key}}, $value; } } %merged; }