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