I want to sort a hash's %h keys in an arbitrary order @seq. I can achieve that by building a helper hash %seq_helper in which the first key is the first item in @seq and the first value is 0, the second key is the next item in @seq and the second value is 1 and so on. Then I can easily compare the items of @seq using <=> and the values of %seq_helper.

However, it does not seem to be possible to make this into a sorting subroutine that accepts a list that tells the sub how I want the items to be sorted. The following is a syntax error after sort by_seq.

use strict; use diagnostics; sub by_seq { my $seq_aref = shift; my %seq_helper; { my $index = 0; for my $item (@{ $seq_aref }) { $seq_helper{$item} = $index; $index++; }; }; return $seq_helper{$a} <=> $seq_helper{$b}; }; # -- my %h = (one=>2,three=>4,five=>6,seven=>8,nine=>0); for (sort by_seq([qw(five nine one seven three)]) keys %h) { print "$_: $h{$_}\n"; }; __DATA__ expected output five: 6 nine: 0 one: 2 seven: 8 three: 4

➀ Why?

➁ How would you solve it?


In reply to sort in arbitrary order with subroutine, syntax error by Anonymous Monk

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.