You don't actually need to use a Schwartzian Transform here, because the operation that is "cached" by the transform (access to the 'num' field of the hash) isn't an expensive operation.

You were on the right track with the "%saw" stuff -- you can just prepend (syntactically; postpend operationally <laugh>) a sort:

my %saw; my @uniq = sort { $a->{num} cmp $b->{num} } grep { ! $saw{$_->{num}}++ } @{$data};

That's all you need.

And for a situation where you do need to use something like a Schwarzian transform, and you'd like to tighten up the code, you could add the grep to the front (or better, the back -- again, syntactically) of the map/sort/map. (Sometimes it's a little mind-bending, but as you've seen, you can string together the list-manipulation operators to your heart's content.) You can't get rid of the grep entirely because neither map nor sort will "drop" items from a list, only transform or rearrange them.


In reply to Re: Can Schwartzian transform be modified to sort an arrayref uniquely? by khkramer
in thread Can Schwartzian transform be modified to sort an arrayref uniquely? by corporate_gadfly

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.