Вы обнаружили ошибку/особенность спецификации perl5, которая, скорее всего, никогда не будет исправлена. Эта ошибка modulo vs i_modulo даже задокументирована как таковая со странным определением modulo, которое отличается от математического определения и реализации в libc, стандартной библиотеке C.
В документации в http://perldoc.perl.org/perlop.html#Multiplicative-Operators описывается только один случай, а не второй. И забывает рассказать всю историю.
"If $b is negative, then $a % $b is $a minus the smallest multiple of $b
that is not less than $a (that is, the result will be less than or
equal to zero)."
Таким образом, -13% 4 не определен, 13% -4 описывается как возвращение -3, а не 1. В действительности -13% 4 возвращает 3 не -1.
Это поведение perl5 только странно без use integer
. С use integer
вы получаете правильное и быстрое поведение libc.
use integer;
print -13 % 4; # => -1
print 13 % -4; # => 1
print -13 % -4; # => -1 (same with or without use integer)
print 13 % 4; # => 1 (same with or without use integer)
{
no integer;
print -13 % 4; # => 3 (different to libc)
print 13 % -4; # => -3 (different to libc)
print -13 % -4; # => -1 (same with or without use integer)
print 13 % 4; # => 1 (same with or without use integer)
}
Обратите внимание, что с оба аргумента быть литеральные целые константы, то результат будет постоянным сложена во время компиляции. Но даже если оба аргумента явно являются целыми типами, постоянная папка использует общий оператор modulo, а не конкретный оператор i_modulo, который используется под целым числом use. Или с типизированным расширением perl, причем оба args являются целыми числами во время компиляции.
Эта ошибка была даже повышена до perl6, определенной в попугаи и moar, как в perl5. Я не уверен, что бэкэнд jvm также использует взломы, чтобы использовать странное определение perl5.
См. Также: [Почему модуль отличается от разных языков программирования?] (Http://stackoverflow.com/questions/450410/why-is-modulus-different-in-different-programming-languages) и [ поведение% с отрицательными операндами, определенными в Perl 5?] (http://stackoverflow.com/questions/3610687/is-the-behavior-of-with-negative-operands-defined-in-perl-5) –