#perl
#perl
Вопрос:
Кто-нибудь может объяснить следующий код Perl для меня, пожалуйста? Я думаю, что это на Perl, и я понятия не имею о программировании на Perl. Пожалуйста, объясните, что делает следующий код?
$t = test(10);
sub test() {
my $str = unpack("B32", pack("N",shift));
$str2 = substr($str,16,length($str));
return $str2;
}
Комментарии:
1.
sub test { sprintf('6X', shift amp; 0xFFFF) }
могло бы быть понятнее
Ответ №1:
Функции pack, unpack и substr описаны здесь, здесь и здесь соответственно.
pack("N"...)
упаковывает число в четырехбайтовое представление сетевого порядка. unpack("B32"...)
распаковывает это упакованное число в виде строки битов (нулей и единиц). substr
Вызов принимает вторую половину этой битовой строки (начиная с бита 16 и далее), которая представляет младшие 16 бит исходного 32-разрядного числа.
Почему он делает это таким образом, для меня загадка. Более простое и быстрое решение — с самого начала разобраться с младшими 16 битами (обратите внимание на нижний регистр "n"
):
sub test($) {
return unpack("B16", pack("n",shift));
}
Комментарии:
1. Или потенциально менее запутанный
return sprintf "6b", shift amp; 0xffff
, который использует операторы, которые вы можете найти на других языках 🙂2. @hobbs: Хорошая мысль! Вы должны представить это как ответ. Хотя вам понадобятся круглые скобки вокруг или после
shift
.
Ответ №2:
shift
выводит первый аргумент функции из списка переданных аргументов
pack("N", shift)
возвращает представление этого значения в 32-битном сетевом порядке байтов
my $str = unpack("B32", pack("N", shift));
хранит представление битовой строки (32 бита) указанного значения (т. Е. строку, которая выглядит как «00010011»).
substr
Содержит ошибки и должен быть substr($str, 16);
, чтобы получить последние 16 символов из приведенного выше. (или substr($str, 16, 16);
.)
Ответ №3:
В дополнение к ответу Марсело, shift
функция принимает @_
в качестве аргумента по умолчанию. @_
содержит аргументы подпрограммы.
Ответ №4:
pack("N", shift)
принимает аргумент функции (возвращаемое значение shift, которое по умолчанию работает с массивом arguments) и преобразует его в целое число. unpack("B32,
Часть затем снова преобразует его в строку, состоящую из 32 бит, то есть строку из 0 и 1. substr
В данном случае просто принимает последние 16 разрядных символов.