in reply to Need to create a blender to mix up lines from a file

I think the following will give you a very good spread. I concocted it from the top of my head, so I don't garantee results.

use strict; use warnings; open(my $fh, '<', '...') or die("Unable to open input file: $!\n"); # Group domains into an AoA. # Very efficient since the input fileis already sorted by domain. my @grouped; my $prev_domain = 'invalid domain'; while (<$fh>) { chomp; my $addr = $_; my $domain = ...; if ($domain ne $prev_domain) { $prev_domain = $domain; unshift(@grouped, []); } push(@{$grouped[0]}, $addr); } # Sort groups by group size. # Gives something like: # @sorted = ( # [ qw( g1 ) ], # [ qw( f1 ) ], # [ qw( e1 ) ], # [ qw( d1 d2 ) ], # [ qw( c1 c2 c3 ) ], # [ qw( b1 b2 b3 ) ], # [ qw( a1 a2 a3 a4 a5 ) ], # ); my @sorted = sort { @$a <=> @$b } @grouped; my @ordered; my $prev_last = 0; my $break = 0; my $offset = 0; for (;;) { my $p = shift(@sorted); last if not defined $p; my $last = $#$p; if ($last != $prev_last) { $prev_last = $last; $break = @ordered / $last; $offset = 0; } foreach my $i (reverse 0..$last) { splice(@ordered, $i*$break+$offset, 0, $p->[$i]); } $offset++; } { local $, = ", "; local $\ = "\n"; print(@ordered); }