Я пытаюсь изменить порядок полей при построении строки с помощью pack
, но не могу заставить pack
делать то, что я хочу. Например, я хочу заполнить строку abc
по смещению 12, defg
по смещению 8 и hi
по смещению 3 (и любым другим, предположительно пробелом или \0
, по смещениям 0-2 и 5-7).
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
ing в любом порядке из строки. Но для pack
ing он \0
-заполняется и усекается, как задокументировано. Есть ли способ остановить его от \0
-заполнения и усечения без изменения порядка шаблона pack
для создания полей слева направо?
Этот вопрос возникает при чтении спецификации поля из внешнего источника. Конечно, шаблон pack
можно организовать в порядке слева направо, а результирующий список можно переупорядочить в соответствии со спецификацией внешнего поля. Но было бы удобно динамически перемещать «курсор» pack
без заполнения промежуточных позиций или усечения.
В приведенном выше коде я был бы счастлив, если бы возвращаемое значение pack(...)
было таким же, как $str
с любым байтом для .
(например, пустым или \0
).
pack
можно заставить просто соблюдать то, что находится в строке в этих других позициях, если вы это имеете в виду. Это объединяет. Это работаsubstr
(но с одним в то время). - person zdim   schedule 29.06.20163
и междуhi
и8
? Оригинальные части$str
? Что тогда происходит с теми диапазонами, которые были распакованы — они тоже остаются такими, как были (то есть дублируются в выходной строке)? - person zdim   schedule 29.06.2016pack
для шаблона пакета. Конечно, было бы здорово иметь возможность очищать или обнулять их по выбору. - person jrw32982   schedule 29.06.20163-5
, теперь в12-14
(и наоборот), и это нормально. Или, возможно, вы хотите вместо этого «пробел» (пробелы). Вы берете 16-символьную строку для переупорядочения или выбираете элементы из строки a и записываете 16-символьную длинную строку, а остальные равны .... нулю? Пробелы? НУЛЬ (вздох)? Есть хорошие решения, но имеет значение, в чем состоит вся работа. Или я может быть совершенно не понимаю его. Можете ли вы опубликовать некоторые входные и выходные данные - источник и то, что вы хотите получить? - person zdim   schedule 29.06.2016unpack
— это$str
. Вывод наpack
должен быть$str
(или аналогичный). - person jrw32982   schedule 29.06.2016unpack
анализирует$str
в порядке справа налево вместо обычного порядка слева направо. Это прекрасно работает. Но когда я пытаюсь использоватьpack
для воссоздания исходного$str
, предоставляя поля дляpack
ed, скажем, в порядке справа налево, конструкция формата позиционирования@POS
, которая отлично работала сunpack
, с треском провалилась для воспроизведения того же исходного значения$str
( или аналогичный) сpack
. - person jrw32982   schedule 29.06.2016substr
функциональность, если я прав.) Писать в комментариях не имело смысла - пожалуйста, дайте мне знать, относится ли это к вашей задаче и могу ли я добавить какие-то другие решения. - person zdim   schedule 29.06.2016