The following is a variation on the 'Schwartzian' transform (Ref: FAQ
How do I sort an array by (anything)?.) Map your array into one that can be sorted easily, sort it, and extract the results.
use strict;
use warnings;
use Test::More tests=>1;
my @transcripts = qw( t1 t1 t2 t2 t1 t2 );
my @alles = qw( a1 a2 a1 a2 a3 a3 );
my @effects = qw( mis mis mis mis del del );
my @transpose_matrix
= map { [shift(@transcripts), shift(@alles), shift(@effects)] } 0.
+.5;
my @sorted_transpose
= sort{ $a->[0] cmp $b->[0] or $a->[1] cmp $b->[1] } @transpose_ma
+trix;
my @sorted_effects = map {$_->[2]} @sorted_transpose;
is_deeply( \@sorted_effects, [qw(mis mis del mis mis del)], 'sort by r
+ow');
UPDATE: Use of zip_by of List::UtilsBy allows the Schwartzian Transform to be coded in the usual way without any explicit loop.
use strict;
use warnings; use Test::More tests=>1;
use List::UtilsBy qw(zip_by);
my @transcripts = qw( t1 t1 t2 t2 t1 t2 );
my @alles = qw( a1 a2 a1 a2 a3 a3 );
my @effects = qw( mis mis mis mis del del );
my @matrix = (\@transcripts, \@alles, \@effects);
my @sorted_effects
= map {$_->[2]}
sort{ $a->[0] cmp $b->[0] or $a->[1] cmp $b->[1] }
zip_by {[@_]}
\@transcripts, \@alles, \@effects;
is_deeply( \@sorted_effects, [qw(mis mis del mis mis del)], 'sort by r
+ow');
Result:
1..1
ok 1 - sort by row