объясните следующий код Perl?

#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 разрядных символов.