in reply to Re: How to perform different sorts on multiple sections of items in the same array
in thread How to perform different sorts on multiple sections of items in the same array
To add stable sorting for the last two categories, restrict the sort to $type and $ord (packed as NN so taking 8 bytes) unless the $type is 0 for both terms, in which case sort the entire strings.
use strict; use warnings; use 5.014; my @strings = qw{ cabin prawn eminent pail error reptile engine copy echo soap eskimo carpet elias emblem skunk cheap }; say for map { substr $_, 8 } sort { unpack( q{N}, $a ) || unpack( q{N}, $b ) ? substr( $a, 0, 8 ) cmp substr( $b, 0, 8 ) : $a cmp $b; } map { my( $type, $ord ); if ( m{r} ) { $type = 0; $ord = 0; } elsif ( m{^e} ) { $type = 1; $ord = ord substr $_, 2, 1; } else { $type = 2; $ord = 255 - ord substr $_, -1, 1; } pack q{NNa*}, $type, $ord, $_; } @strings;
The output, note that 'eminent' and 'elias' have the same 3rd character but now retain their relative order, as do 'soap' and 'cheap' with matching final characters in the last category.
carpet error prawn reptile emblem engine echo eminent elias eskimo copy soap cheap cabin pail skunk
I hope this is of interest.
Cheers,
JohnGG
|
|---|