sub sortsub {
$a cmp $b ||
other_function( $a, $b ) ||
...
}
####
sub sortsub {
string_compare( $a, $b ) ||
other_function( $a, $b ) ||
...
}
##
##
sub sortsub {
my @subs = @_;
foreach my $sub ( @subs )
{
my $result = $sub->($a, $b);
return $result if $result;
}
}
##
##
sub make_sort_sub {
my @subs = @_;
return sub {
foreach my $sub ( @subs )
{
my $result = $sub->($a, $b);
return $result if $result;
}
};
}
##
##
my $sort_sub = make_sort_sub( @sub_references );
my @sorted = sort { $sort_sub->() } @stuff;
##
##
#!/usr/bin/perl
# pre-defined common sort subroutines
my %Subs = (
numeric_descending => sub { $b <=> $a },
numeric_ascending => sub { $a <=> $b },
string_descending => sub { $b cmp $a },
string_ascending => sub { $b cmp $a },
case_insensitive => sub { "\L$a" cmp "\L$b" },
);
sub make_sort_sub {
my @subs = @_;
return sub {
foreach my $sub ( @subs )
{
my $result = $sub->($a, $b);
return $result if $result;
}
};
}
# numbers
{
my @use_these_subs = map { $Subs{$_} } qw(numeric_descending);
my $sort_sub = make_sort_sub( @use_these_subs );
my @sorted =
sort { $sort_sub->() } qw( 1 10 11 100 2 12 21 3 31 300 4 5 6 66 7 71 );
print "@sorted\n";
}
# strings
{
my @use_these_subs = map { $Subs{$_} } qw(case_insensitive string_ascending);
my $sort_sub = make_sort_sub( @use_these_subs );
my @sorted =
sort { $sort_sub->() } qw( Fred fred FReD Barney barney Betty BETTY );
print "@sorted\n";
}
# strings by length with user defined subroutine
{
my @use_these_subs = ( sub { length $a <=> length $b } );
push @use_these_subs, map { $Subs{$_} } qw(string_ascending);
my $sort_sub = make_sort_sub( @use_these_subs );
my @sorted =
sort { $sort_sub->() } qw( Fred fred FReD Barney barney Betty BETTY );
print "@sorted\n";
}