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

Re: Amusing Ordity: Ord Range Behavior

by kcott (Abbot)
on Aug 06, 2013 at 10:42 UTC ( #1048086=note: print w/ replies, xml ) Need Help??


in reply to Amusing Ordity: Ord Range Behavior

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


Comment on Re: Amusing Ordity: Ord Range Behavior
Select or Download Code
Re^2: Amusing Ordity: Ord Range Behavior
by QM (Vicar) on Aug 06, 2013 at 13:32 UTC
    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: note [id://1048086]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (6)
As of 2014-12-28 00:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

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





    Results (177 votes), past polls