Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

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

by Courage (Parson)
on Dec 01, 2004 at 15:21 UTC ( #411472=note: print w/replies, xml ) Need Help??

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

Although you give examples of strange code and it does not pretend to be good, I can't resist pointing that:

code block given to sort must behave (as POD stays.)
Namely, once f(a,b) return false f(b,a) must return true.
Some versions of perl dumped core when fed some misbehaving comparision sub.
Such core dumps were fixed, but general rule remain: comparision sub must behave

This means that sort {rand(5) <=> rand(5)} is obviously wrong, but sort {1} also not good.

Best regards,
Courage, the Cowardly Dog

Replies are listed 'Best First'.
Re^5: Pearls (not really) of Perl programming
by htoug (Deacon) on Dec 01, 2004 at 18:49 UTC
    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.

      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

Re^5: Pearls (not really) of Perl programming
by ysth (Canon) on Dec 01, 2004 at 16:49 UTC
    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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://411472]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2018-02-23 21:23 GMT
Find Nodes?
    Voting Booth?
    When it is dark outside I am happiest to see ...

    Results (310 votes). Check out past polls.