my %subcat = (Foo => 3, Bar => 2, Baz => 10, Quux => 1); my @Keys = keys %subcat; while (my $Temp = [splice @Keys, 0, 3]){ print "\n"; print defined @$Temp[0] ? " @$Temp[0] ($subcat{@$Temp[0]})\n" : " \n"; print defined @$Temp[1] ? " @$Temp[1] ($subcat{@$Temp[1]})\n" : " \n"; print defined @$Temp[2] ? " @$Temp[2] ($subcat{@$Temp[2]})\n" : " \n"; print "\n"; last unless @Keys; }