The comparison function for sort must not just return 'true' and 'false'. It must return '-1', '0' and '+1' for comparing 'Less Than', 'Equal To' and 'Greater Than', just like the two standard comparison operators 'cmp' and '<=>' (for stringwise and numeric comparison respectively).
Just using 'true' (ie non-zero, probably 1) and false (ie 0 or '') will lead to confusion. If `f(a, b)` is 'false' then `f(b, a)` must also be false because a 'Equals' b - for whatever value of 'Equals' this sorting choses to use.
If `f(a, b)` is 'true' then `f(b, a)` must return '-1' (ie a true value, but *not* just true) because a is 'Greater Than' b in this case, and therefore b must be 'Less Than' a - not 'Equal To', or something is decidedly wierd.
You have to be consistent however you chose to do it. | [reply] |

You're right, thanks for correction.
I just could not resist to point out for general idea (I saw that in p5p list) but I forgot to recheck all details
But once we decided to be precise, let me make additional correction.
Requirement to return '-1', '0' and '+1' is too restrictive. According to perldoc -f sort:
`parison order. If SUBNAME is specified, it gives the name of a
subroutine that returns an integer less than, equal to, or
greater than 0, depending on how the elements of the list are
to be ordered. (The "<=>" and "cmp" operators are extremely
useful in such routines.) SUBNAME may be a scalar variable
`
So any negative and positive values are ok.
Best regards,
Courage, the Cowardly Dog
| [reply] [d/l] |

To clarify, prior to perl 5.005 (!) sort used to use libc's qsort, which would sometimes coredump on certain platforms with pathological return values. But this isn't a concern any longer unless you are stuck with a *really* old perl. | [reply] |