I've written some code to sort an array by the values in another array. I'd like some monastery reaction, pointers, and correction.

Precisely what I want to do, is sort the elements of an array, @sortme = qw(foo bar baz cat dog elephant bird, based on the order of the elements in another array, @order = (whale elephant dog cat), placing unlisted (in @order) items at the end of the list.

Here's the code:

#!/usr/bin/perl -w use strict; use Data::Dumper; my @sites = qw(Hillsboro Rialto Santa_Ana Memphis Richmond); my @sortme = sort {$a cmp $b} @sites; unshift @sortme, 'Foo', 'Bar'; print Dumper \@sortme; { my %order; foreach (0..$#sites) { $order{$sites[$_]} = $_; # build index } $order{DEFAULT} = $#sites + 1; my @sorted = sort { if (exists $order{$a} && exists $order{$b}) { $order{$a} <=> $order{$b} } elsif ( exists $order{$a}) { $order{$a} <=> $order{DEFAULT} } elsif ( exists $order{$b} ) { $order{DEFAULT} <=> $order{$b} } else { $a cmp $b } } @sortme; print Dumper \@sorted }
This seems to work fine. But, I'd like to know, is there a better/faster/cleaner algorithm that I would know of if I didn't always sleep through my CS classes? Should I be using map to do this?

TIA


TGI says moo


In reply to Sorting an array by another array by TGI

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.