And here, for completeness, is a (presumably much slower) solution based on the opposite assumptions (extra letters last, and continue the comparison down the string). This is, of course, more or less equivalent to rewriting cmp with your own alphabet. It could undoubtedly be done faster with an iterative solution, but then it could also be done faster in C.
use strict;
use vars '$sortstr';
my @list = qw(a z b y c x);
my @list2 = qw(zulu zuzu zucu charlie fred xray yankee bravo alpha);
$sortstr = join('', @list);
my @sorted_list = sort mycmp @list2;
sub mycmp {
my ($A, $B)= @_ ? @_ : ($a,$b);
my $temp;
my $Aspot = ($temp = index($sortstr,substr($A,0,1))) < 0 ?
length($sortstr) : $temp;
my $Bspot = ($temp = index($sortstr,substr($B,0,1))) < 0 ?
length($sortstr) : $temp;
return
$Aspot <=> $Bspot
||
mycmp(substr($A,1),substr($B,1))
||
$A cmp $B
}
Sorts to:
alpha zuzu zucu zulu bravo yankee charlie xray fred
If God had meant us to fly, he would *never* have give us the railroads.
--Michael Flanders
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.