use strict; use warnings; use 5.014; my %sortCriteria = ( field1 => { q{} => q{$a->[ 1 ] cmp $b->[ 1 ]}, a => q{$a->[ 1 ] cmp $b->[ 1 ]}, d => q{$b->[ 1 ] cmp $a->[ 1 ]}, n => q{$a->[ 1 ] <=> $b->[ 1 ]}, na => q{$a->[ 1 ] <=> $b->[ 1 ]}, nd => q{$b->[ 1 ] <=> $a->[ 1 ]}, an => q{$a->[ 1 ] <=> $b->[ 1 ]}, dn => q{$b->[ 1 ] <=> $a->[ 1 ]}, }, field2 => { q{} => q{$a->[ 2 ] cmp $b->[ 2 ]}, a => q{$a->[ 2 ] cmp $b->[ 2 ]}, d => q{$b->[ 2 ] cmp $a->[ 2 ]}, }, field3 => { q{} => q{$a->[ 3 ] cmp $b->[ 3 ]}, a => q{$a->[ 3 ] cmp $b->[ 3 ]}, d => q{$b->[ 3 ] cmp $a->[ 3 ]}, n => q{$a->[ 3 ] <=> $b->[ 3 ]}, na => q{$a->[ 3 ] <=> $b->[ 3 ]}, nd => q{$b->[ 3 ] <=> $a->[ 3 ]}, an => q{$a->[ 3 ] <=> $b->[ 3 ]}, dn => q{$b->[ 3 ] <=> $a->[ 3 ]}, }, field4 => { q{} => q{$a->[ 4 ] cmp $b->[ 4 ]}, a => q{$a->[ 4 ] cmp $b->[ 4 ]}, d => q{$b->[ 4 ] cmp $a->[ 4 ]}, }, ); my @array = map { map { [ split m{,} ] } split m{\n} } <[ 0 ]"\n} unless exists $sortCriteria{ $criterion->[ 0 ] }; $criterion->[ 1 ] = q{} unless defined $criterion->[ 1 ]; die qq{Invalid modifier "$criterion->[ 1 ]"}, qq{ for field "$criterion->[ 0 ]"\n} unless exists $sortCriteria{ $criterion->[ 0 ] }->{ $criterion->[ 1 ] }; } return eval q|sub { | . join( q{ || }, map { $sortCriteria{ $_->[ 0 ] }->{ $_->[ 1 ] } } @criteria ) . q| }|; }