|Perl: the Markov chain saw|
Re: Amusing Ordity: Ord Range Behaviorby kcott (Abbot)
|on Aug 06, 2013 at 10:42 UTC||Need Help??|
ord evaluates its argument(s) in scalar context. With warnings on:
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:
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($.):
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:
So, ord('a'..'g') evaluates to ord(1) and returns the ASCII value of the character 1 (i.e. 49):