http://qs321.pair.com?node_id=330568

knowmad has asked for the wisdom of the Perl Monks concerning the following question:

In case the subject isn't entirely clear, what I'm trying to achieve is a sort of an array of hashes by a field which contains the following three keywords -- Local, State, National. The trick is that I need to sort the records in that order. Thus a straight-forward alpha sort will not work.

I checked the Q&A, searched PM and Google and checked my various Perl books to no avail. I have a solution but am hoping a more clever monk could make it more efficient.

#!/usr/bin/perl use strict; use Data::Dumper; my @advocates = ( { fld_title => 'Rec1', fld_type => 'National', }, { fld_title => 'Rec2', fld_type => 'State', }, { fld_title => 'Rec3', fld_type => 'Local', }, ); sub by_locale { my $a_type; my $b_type; $a_type = 1 if ($a->{'fld_type'} =~ /local/i); $a_type = 2 if ($a->{'fld_type'} =~ /state/i); $a_type = 3 if ($a->{'fld_type'} =~ /national/i); $b_type = 1 if ($b->{'fld_type'} =~ /local/i); $b_type = 2 if ($b->{'fld_type'} =~ /state/i); $b_type = 3 if ($b->{'fld_type'} =~ /national/i); $a_type <=> $b_type; } my @sorted_advocates = sort by_locale @advocates; warn Dumper("unsorted_advocates", \@advocates); warn Dumper("sorted_advocates", \@sorted_advocates);

Thanks for any pointers,

-Wm