use strict; use Data::Dumper; my $chunks = 17; my $free_slots = {1 => 5 , 2 => 3 , 3 => 4 , 4 => 2 , 5 => 3}; my @mch = (1 , 2 , 3 , 4 , 5); my %mch_distro; my $leftovers = 0; while($leftovers < $chunks){ foreach (@mch){ last if ($leftovers == $chunks); if ($mch_distro{$_} < $free_slots->{$_}){ $mch_distro{$_}++; $leftovers++; } else{ next; } } } print Dumper(\%mch_distro);