Assuming a recent version of Perl, I think your original code would work if the first sort were:
sort { exists $b->{vtype_ug} <=> exists $a->{vtype_ug} }
(untested, but I think it's the right idea)

A sort sub should return positive if $a is greater than $b, 0 if they are equal, and negative if $b is greater than $a. So if you want items with vtype_ug to always sort before items that don't have it, you need to return -1 if you find it only in $a, 1 if you find it only in $b, or 0 if it is in both or neither.

According to sort's documentation, in Perl 5.7 and newer sorts are "stable", which means that if two items are equal they'll stay in the same order. This should ensure that two sorts work. However, as others have mentioned, you can expect better performance and better portability if you use one sort sub that does both comparisons:

sort { (exists $b->{vtype_ug} <=> exists $a->{vtype_ug}) || ($a->{total_rate} <=> $b->{total_rate}) }

Update: bart is right on all points, and I've corrected them above. Thanks!


In reply to Re: Sorting on Exists by sgifford
in thread Sorting on Exists by ropey

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.