Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Amusing Ordity: Ord Range Behavior

by QM (Vicar)
on Aug 06, 2013 at 08:43 UTC ( #1048061=perlquestion: print w/ replies, xml ) Need Help??
QM has asked for the wisdom of the Perl Monks concerning the following question:

Not a question, just seems like a nice distraction for this sleep deprived monk.

Testing out a code snippet in the debugger today, only a cup or two shy of my caffeine requirements, I tried this:

DB<1> x ord('a'..'g') 0 49

...which I recognize as not being correct, but wondered about the return value, 49. Immediately I fixed it like this:

DB<2> x map {ord} 'a'..'g' 0 97 1 98 2 99 3 100 4 101 5 102 6 103

But I wondered where 49 came from. Then it hit me:

DB<3> x chr(ord('a'..'g')) 0 1

Which made me think of this:

DB<4> x chr(ord(()=('a'..'g'))) 0 7

Bonus ++points for guessing what ord is up to here =)

-QM
--
Quantum Mechanics: The dreams stuff is made of

Comment on Amusing Ordity: Ord Range Behavior
Select or Download Code
Re: Amusing Ordity: Ord Range Behavior
by BrowserUk (Pope) on Aug 06, 2013 at 08:47 UTC

        I guessed. Wrong :)


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: Amusing Ordity: Ord Range Behavior
by choroba (Abbot) on Aug 06, 2013 at 08:55 UTC
      Isn't this rather a meditation?
      Yes, perhaps it is. I have no problem with it being moved.

      -QM
      --
      Quantum Mechanics: The dreams stuff is made of

Re: Amusing Ordity: Ord Range Behavior
by kcott (Abbot) on Aug 06, 2013 at 10:42 UTC

    G'day QM,

    ord evaluates its argument(s) in scalar context. With warnings on:

    $ perl -Mwarnings -E 'say ord("a" .. "g")' Argument "a" isn't numeric in range (or flip) at -e line 1. Use of uninitialized value $. in range (or flip) at -e line 1. Argument "g" isn't numeric in range (or flop) at -e line 1. Use of uninitialized value $. in range (or flop) at -e line 1. 49

    Scalar context is evident by the fact that the .. operator is treated as a flip-flop (see perlop - Range Operators). It can also be seen by printing the expression in both list and scalar contexts:

    $ perl -Mwarnings -E 'say("a" .. "g")' abcdefg
    $ perl -Mwarnings -E 'say scalar("a" .. "g")' Argument "a" isn't numeric in range (or flip) at -e line 1. Use of uninitialized value $. in range (or flip) at -e line 1. Argument "g" isn't numeric in range (or flop) at -e line 1. Use of uninitialized value $. in range (or flop) at -e line 1. 1E0

    In scalar context, there's the same warning messages. There's also the next piece of the puzzle: 1E0. Going back to the Range Operators doco, the evaluation of "a" == $. is actually int("a") == int($.):

    $ perl -Mwarnings -E 'say int("a")' Argument "a" isn't numeric in int at -e line 1. 0
    $ perl -Mwarnings -E 'say int($.)' Use of uninitialized value $. in int at -e line 1. 0

    So, int("a") == int($.) evaluates to 0 == 0 (which is obviously TRUE). There's also the first two of the four warning messages; repeating for "g" would give the other two messages. Therefore, both the left and right operands of .. evaluate as TRUE; and so, the whole expression "a" .. "g" also evaluates as TRUE.

    Going back a final time to the Range Operators doco:

    "The value returned is either the empty string for false, or a sequence number (beginning with 1) for true. The sequence number is reset for each range encountered. The final sequence number in a range has the string "E0" appended to it, which doesn't affect its numeric value, ..."

    So, as the range was only encountered once, the value returned is 1E0 which has a numerical value of 1. For anyone unfamiliar with that:

    $ perl -Mwarnings -E 'say(1E0)' 1
    $ perl -Mwarnings -E 'say(1 * 10**0)' 1

    So, ord('a'..'g') evaluates to ord(1) and returns the ASCII value of the character 1 (i.e. 49):

    $ perl -Mwarnings -E 'say ord(1)' 49
    $ perl -Mwarnings -E 'say chr(49)' 1

    -- Ken

      Brilliant!

      -QM
      --
      Quantum Mechanics: The dreams stuff is made of

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1048061]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (13)
As of 2014-10-23 21:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (129 votes), past polls