Определено ли поведение% с отрицательными операндами в Perl 5? - PullRequest
5 голосов
/ 31 августа 2010

До недавнего времени (т. Е. C99) поведение оператора по модулю было реализацией, определенной в C. Поскольку Perl 5 написан на C, зависит ли он от поведения компилятора C, использованного для его построения?

Ответы [ 2 ]

10 голосов
/ 31 августа 2010

Нет, Perl 5 определяет оператор по модулю в perlop и даже имеет тесты для проверки его работоспособности в соответствии с документацией.

из perl / t / op / arith.t

tryeq $T++,  13 %  4, 1;
tryeq $T++, -13 %  4, 3;
tryeq $T++,  13 % -4, -3;
tryeq $T++, -13 % -4, -1;

Однако, если вы используете прагму integer, вы попадаете на милость компилятора C.

2 голосов
/ 31 августа 2010

Perl реализует свой собственный оператор по модулю, но вы можете получить его из своего компилятора C, используя прагму integer . perlop говорит

Обратите внимание, что, когда целочисленное использование находится в области видимости, «%» предоставляет вам прямой доступ к оператору по модулю, как это реализовано вашим компилятором C.Этот оператор не так хорошо определен для отрицательных операндов, но он будет выполняться быстрее.

То есть вы должны быть осторожны, когда используете integer , потому что модуль может датьВы разные ответы.

...