Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

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


Comment on Re^4: Pearls (not really) of Perl programming
Select or Download Code
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.
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

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (10)
As of 2014-12-26 22:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (176 votes), past polls