Fellow Monks, I seek your Perls of wisdom.
I have an array of arrays. the lower level arrays are records with values both numeric and alpha. I want to give the user the option to sort on any of these fields. I thought it would be nice to use a simple hash table referencing the record number to sort on and the comparator to use. I am having a problem using a variable containing comparator. Am I missing something or do I just need another approach?
my $sort = 'hours'; # really comes from a switch
my %map = ( # sorting map
hours => [0, \sub {<=>}],
code => [1, \sub {cmp}],
name => [2, \sub {cmp}],
);
# example data
my @records = (
[10, 'xyz232', 'secret project'],
[ 5, 'foo123', 'world domination'],
[ 7, 'bar666', 'have a beer'],
);
for (
sort {$a->[$map{$sort}->[0]] $map{$sort}->[1] $b->[$map{$sort}->[
+0]]}
@records
) {
print join ", ", @$_;
}
Update
among many variations of syntax I also tried the following. I feel it may be getting closer, other than the fact it won't compile :)
my %map = (
hours => sub {sort { $_[0] <=> $_[0] } };,
number => sub {sort { $_[0] <=> $_[0] } };,
name => sub {sort { $_[0] <=> $_[0] } };,
task => sub {sort { $_[0] <=> $_[0] } };,
);
Cheers,
R.
Pereant, qui ante nos nostra dixerunt!
-
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.