Corion,
the algorithm in your sort sub doesn't do what princepawn wants : put 'Organization' before 'Services' before 'FAQ' (and not care about anything else...) .
In fact, if you're sorting a list based only on these, the function will always return 1, because the first match will always be true.
I think the best you could reduce this to (excluding the transform you mentioned, which I'm unfamiliar with) would be a foreach loop, like so (shows pp's implementation, yours and mine) :
#! perl -l
my @foo =( "Service", "Organization", "FAQ");
my @priorities = qw(Organization FAQ Service);
my $prio_top = join "|", map { "^$_" } @priorities;
print join " ", sort by_priority @foo;
print join " ", sort boo @foo;
print join " ", sort corion @foo;
sub by_priority {
return -1 if $a =~ /^Organization/ ;
return 1 if $b =~ /^Organization/ ;
return -1 if $a =~ /^Service/ ;
return 1 if $b =~ /^Service/ ;
return -1 if $a =~ /^FAQ/ ;
return 1 if $b =~ /^FAQ/ ;
return 0 ;
}
sub boo {
foreach ("Organization", "Service", "FAQ") {
return 1 if $b=~/^\Q$_\E/;
return -1 if $a=~/^\Q$_\E/;
}
return 0;
}
sub corion {
# Return 0 on string identity
return 0 if $a eq $b;
return -1 if $a =~ /$prio_top/o;
return 1 if $b =~ /$prio_top/o;
# Alphabetical sort for the rest
return $a cmp $b;
}