Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > операция сдвига perl и js


Автор: Сisa 15.4.2013, 13:22
Помогите перевести строку из js в  perl:
Код

alert( -33538176>>15 );   //    -1024


Код

print -33538176>>15,"\n";   #  130048

По идее должен получиться одинаковый ответ, т.е. мне нужно получить и в perl тоже 
-1024 так же как и с js.
При положительных числах еще как то возможно понять как это работает, но при использовании отрицательного числа при сдвиге...

Автор: alezzz 15.4.2013, 13:29
а при отрицательных мне кажется зависит от архитектуры
Код

print -33538176>>15,"\n";

Код

562949953420288

Код

This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x64-multi-thread

Автор: Сisa 15.4.2013, 13:38
У меня:
This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x86-multi-thread

Архитектура может конечно, но ведь и js на этой же самой машине выполняется, что и перл.

Добавлено через 5 минут и 33 секунды
Наверно будет лишним изобретать какие то дополнительные преобразующие функции в текстовую строку, а там index, regexp, join и т.п.
Очевидно чего то я не знаю, и не понимаю, но должно быть элементарное подобное действие и в перл.

Автор: DurRandir 15.4.2013, 14:58
Цитата
Архитектура может конечно, но ведь и js на этой же самой машине выполняется, что и перл.

Это вообще ни о чём не говорит - к примеру, 32 битные бинарники на x64 машине.

Чтобы получить ответ "как в js" для данного примера, то 

Код
use integer; print -33538176>>15


Ну и Капитан Очевидность советует читать документацию.

Цитата
perldoc perlop:

Note that both "<<" and ">>" in Perl are implemented directly using
"<<" and ">>" in C.  If "use integer" (see "Integer Arithmetic") is in
force then signed C integers are used, else unsigned C integers are
used.

Автор: Pfailed 15.4.2013, 15:11
Как вариант
Код

use v5.10;
use JE;

$j = new JE;
say $j->eval('-33538176>>15');

Автор: Сisa 15.4.2013, 15:55
Так :
Код

$t = -33538176;
if($t<0){
 $t*=-1;
 $t>>=15;
 $t++;
 $t*=-1;
}else{
 $t>>=15;
}
print $t; 

совсем неправильно? или можно так делать, ответы вроде бы для этих чисел сошлись...

Добавлено через 12 минут и 42 секунды
Если и perldoc (никак не научусь его читать) говорит что целые используются иначе без знака как в C
(С для меня только в перспективе), то получается что последний мой вариант с умножением на -1 должен быть нормальным smile

Автор: Сisa 15.4.2013, 16:12
use integer; print -33538176>>15; решение очень подходит, 
но все же попробую без привлечения дополнительных модулей.

Автор: DurRandir 15.4.2013, 22:56
use integer - не модуль, а прагма. perldoc perlop, perldoc integer.

Автор: Сisa 16.4.2013, 23:35
Прагма оказывается очень полезная штука! надо поизучать. Спасибо DurRandir!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)