With perl -e \'$string=\"a\";print ++$string;\'
we get b
,
but with perl -e \'$string=\"b\";print --$string;\'
we get -1
perlop(1) explains that this is true, but doesn't give a rationale:
The auto-increment operator has a little extra builtin magic to it. [If applicable, and subject to certain constraints,] the increment is done as a string, preserving each character within its range, with carry[...]
The auto-decrement operator is not magical.
The reason you get -1 is because when interpreted as a number, "b" turns into 0 since it has no leading digits (Contrarily, "4b" turns into 4).
There are at least three reasons:
Raku (née Perl 6) on the other hand does not suffer from a need for backwards compatibility, and therefore has better behavior for auto-incrementing strings and has auto-decrementing as well. The ++ and -- operators work by calling the succ and pred methods on the object they are operating on.
Perl give us lots of facilities, why not this one?
Because it is not intuitive what values should precede the "lowest" character in range. It may make sense that "A" + 1
should be "B"
, and that "B" + 1
should be "C"
. And therefore "B" - 1
should be "A"
. But what should "A" - 1
be?