#!/usr/bin/perl use sort '_quicksort'; use List::Util 'shuffle'; my @items = 'A'..'X'; my $prefer = prefer(qw/G B Z I Q J/); my $stable = stable(qw/G B Z I Q J/); for (1..10000) { my @foo = shuffle @items; my $p = "@{[sort {&$prefer} @foo]}\n"; my $s = "@{[sort {&$stable} @foo]}\n"; print "@foo\n", $p, $s if $p ne $s; } sub prefer { my @preferred = @_; sub { for ( @preferred ) { $a eq $_ and return -1; $b eq $_ and return 1; } $a cmp $b } } sub stable { my %preferred; @preferred{@_} = 0 .. $#_; sub { exists $preferred{$a} and exists $preferred{$b} and return $preferred{$a} - $preferred{$b}; exists $preferred{$a} and return -1; exists $preferred{$b} and return 1; $a cmp $b; } }