Я пытаюсь изменить порядок полей при построении строки с помощью pack
, но я не могу получить pack
, чтобы делать то, что хочу. Например, я хочу заполнить строку abc
со смещением 12, defg
со смещением 8 и hi
со смещением 3 (и что угодно, предположительно пробел или \0
, при смещениях 0-2 и 5-7).Как использовать функцию пакета perl для переопределения полей
perl -e '
use strict; use warnings;
my $str = "...hi...defgabc";
my $fmt = q{@12 a3 @8 a4 @3 a2};
my @a = unpack $fmt, $str;
print "<$_>\n" for @a;
print "\n";
print unpack("H*", pack($fmt, @a)), "\n";
'
Это прекрасно работает для unpack
ИНГ полей в произвольном порядке из строки. Но для pack
ing, это \0
- заполняет и усекает как documented. Есть ли способ остановить его с \0
-заполнение и усечение без изменения порядка pack
шаблона для создания полей слева направо?
Этот вопрос возникает при чтении спецификации поля из внешнего источника. Разумеется, он может быть организован для шаблона pack
, который будет создан в порядке слева направо, и результирующий список можно переупорядочить в соответствии со спецификацией внешнего поля. Но было бы удобно переместить курсор pack
динамически без заполнения промежуточных позиций или усечения.
В приведенном выше коде, я был бы рад, если возвращаемое значение pack(...)
была такой же, как $str
с любым байтом для .
(например, пустой или \0
).
Я не думаю, что 'pack' может быть сделано, чтобы просто почитать то, что находится в строке на этих других позициях, если это то, что вы имеете в виду. Он объединяется. Это задача 'substr' делать это (но с одним в то время). – zdim
Итак, что вы хотите быть в тех других местах, до '3' и между' hi' и '8'? Исходные части '$ str'? Затем, что происходит с теми диапазонами, которые были распакованы - они также остаются такими, какими они были (тогда они дублируются в выходной строке)? – zdim
@zdim На данный момент меня не волнуют другие позиции. Вопрос заключается в том, как изменить порядок позиций полей в аргументах 'pack' для шаблона пакета. Разумеется, было бы здорово, если бы можно было пустить или выбрать NUL по своему выбору. –