use warnings; use strict; # The terms are to be sorted in this order: # SM (summer) # AU (autumn) # WI (winter) # SP (spring) sub by_term { my($t1, $t2)=@_; if ($t1 eq 'SM') { return $t2 eq 'SM' ? 0 : -1 } if ($t1 eq 'AU') { return 1 if $t2 eq 'SM'; return $t2 eq 'AU' ? 0 : -1 } if ($t1 eq 'WI') { return 1 if $t2 =~ /SM|AU/; return $t2 eq 'WI' ? 0 : -1 } if ($t1 eq 'SP') { return $t2 eq 'SP' ? 0 : 1 } } my @a = @b = qw(SM AU WI SP); # by_term() returns the right integer for each possible comparison for my $a (@a) { for my $b (@b) { warn "$a - $b" . by_term($a, $b); } } # however, the test suite yields only the input array! my @try = ( [qw(WI AU SM SP)], [qw(SP AU SM WI)], [qw(AU WI SP SM)] ); for my $try (@try) { my @sort = sort by_term @$try; warn "@sort"; }