Increment (++) and decrement (--) strings in Perl

前端 未结 3 1450
执念已碎
执念已碎 2020-12-18 17:45

With perl -e \'$string=\"a\";print ++$string;\' we get b,
but with perl -e \'$string=\"b\";print --$string;\' we get -1

相关标签:
3条回答
  • 2020-12-18 18:23

    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).

    0 讨论(0)
  • 2020-12-18 18:30

    There are at least three reasons:

    1. because there isn't any great need for it
    2. the magic of auto-incrementing has been seen to be faulty, and there is no reason implement auto-decrementing in the same faulty way
    3. the magic of auto-incrementing cannot be fixed because p5p doesn't like to break backwards compatibility

    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.

    0 讨论(0)
  • 2020-12-18 18:46

    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?

    0 讨论(0)
提交回复
热议问题