Я не уверен, что вы пытаетесь сделать здесь.unpack("B*", $old_str)
создает битовую строку, содержащую следующие биты (пробелы, добавленные для удобства чтения):
00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000
… другими словами, битовая строка, соответствующая номерам ASCII для ваших символов:
$ perl -E "printf('%#b ', ord) for split(//, '9876543210')"
0b111001 0b111000 0b110111 0b110110 0b110101 0b110100 0b110011 0b110010 0b110001 0b110000
Тогда вы делаете pack('B5', '00111001…')
, что кажется немного сложным.Похоже, pack
возвращает байт, состоящий из пяти крайних правых бит в первом 8-кортеже (11001
).Это дает 56 или строку 8
(поскольку ASCII для 8
равно 56):
$ perl -E "say ord pack('B5', '00111001…')"
56
$ perl -E "say pack('B5', '00111001…')"
8
И когда вы printf
строка, вы получите двоичное числовое представление числа 8:
$ perl -E "say printf '%#b', '8'"
0b10001
(Это безумие.)