Подтвердить что ты не робот

Инкремент (++) и декремент (-) в Perl

С perl -e '$string="a";print ++$string;' получаем b,
но с perl -e '$string="b";print --$string;' получаем -1.

Итак, если мы можем увеличивать, почему мы не можем уменьшить?

EDITED
"Оператор автоматического декремента не магический" perlop

Perl дает нам много возможностей, почему бы и нет? Это не критика, но не ожидалось бы подобного поведения для подобных операторов? Есть ли какая-то особая причина?

4b9b3361

Ответ 1

perlop (1) объясняет, что это правда, но не дает оснований:

Оператор автоматического инкремента имеет немного дополнительной встроенной магии. [Если применимо и зависит от определенных ограничений], приращение выполняется как строка, сохраняя каждый символ в пределах своего диапазона, с переносом [...]

Оператор автоматического декремента не магический.

Причина, по которой вы получаете -1, состоит в том, что, когда интерпретируется как число, "b" превращается в 0, так как он не имеет ведущих цифр (напр., "4b" превращается в 4).

Ответ 2

Существует по крайней мере три причины:

  • потому что нет никакой большой необходимости в нем
  • Магия автоинкремента была замечена как ошибочная, и нет никакой причины реализовать автоматическое декретирование тем же самым образом.
  • Магия автоматического инкремента не может быть исправлена, потому что p5p не хочет нарушать обратную совместимость.

Perl 6, с другой стороны, не страдает от необходимости обратной совместимости и, следовательно, имеет лучшее поведение для строк с автоматическим увеличением и также имеет автоматическое декремент. См. спецификация S03.

Ответ 3

Perl дает нам много возможностей, почему бы и нет?

Потому что это не интуитивно, какие значения должны предшествовать "самому низкому" значению в диапазоне. Может иметь смысл, что "A" + 1 должен быть "B", а "B" + 1 должен быть "C". И поэтому "B" - 1 должен быть "A". Но что должно быть "A" - 1 быть?