Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re^5: Pearls (not really) of Perl programming

by htoug (Deacon)
on Dec 01, 2004 at 18:49 UTC ( #411533=note: print w/replies, xml ) Need Help??

in reply to Re^4: Pearls (not really) of Perl programming
in thread Pearls (not really) of Perl programming

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.

  • Comment on Re^5: Pearls (not really) of Perl programming

Replies are listed 'Best First'.
Re^6: Pearls (not really) of Perl programming
by Courage (Parson) on Dec 01, 2004 at 23:35 UTC
    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

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://411533]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (3)
As of 2022-11-28 04:11 GMT
Find Nodes?
    Voting Booth?