#!/usr/bin/env perl use strict; use warnings; use Data::Dump; my @A = qw{H1 H2 H3 H4}; my @B = 1 .. 10; my %result; my $reverse = 0; while (@B) { build_hash(\%result, \@A, \@B, $reverse); $reverse ^= 1; } dd \%result; sub build_hash { my ($result, $A, $B, $reverse) = @_; my @keys = @$B >= @$A ? @$A : @$A[0 .. $#$B]; my @values; if ($reverse) { unshift @values, shift @$B for (0 .. $#keys); } else { push @values, shift @$B for (0 .. $#keys); } push @{$result->{$keys[$_]}}, $values[$_] for 0 .. $#keys; } #### { H1 => [1, 8, 9], H2 => [2, 7, 10], H3 => [3, 6], H4 => [4, 5] } #### my @B_copy = @B; ... while (@B_copy) { build_hash(\%result, \@A, \@B_copy, $reverse); ... #### my @A = qw{H1 H2 H3 H4 H5}; my @B = 1 .. 23; #### { H1 => [1, 10, 11, 20, 21], H2 => [2, 9, 12, 19, 22], H3 => [3, 8, 13, 18, 23], H4 => [4, 7, 14, 17], H5 => [5, 6, 15, 16], }