/^(?=.*a)(?=.*b)(?=.*c).*d/ or die; #### my %order; @order{qw( a b c d )} = map length, /^(?=(.*?)a)(?=(.*?)b)(?=(.*?)c)(.*?)d/ or die; my @ordered = sort { $order{$a} <=> $order{$b} } keys %order; #### my @order = map length, /^(?=(.*?)a)(?=(.*?)b)(?=(.*?)c)(.*?)d/ or die; my @ordered = ( qw( a b c d ) )[ sort { $order[$a] <=> $order[$b] } 0..$#order ]; #### my @unordered = qw( a b c d ); my @order; for my $s (@unordered) { push @order, /\Q$s/ ? $-[0] : die; } my @ordered = @unordered[ sort { $order[$a] <=> $order[$b] } 0..$#order ];