Perl: проанализируйте закодированную шестнадцатеричными числами строку в массив с regex

Я довольно плохо знаком с разработкой Perl, и я хотел бы выполнить следующую задачу:

Мой сценарий получает закодированную шестнадцатеричными числами строку как параметрический усилитель командной строки. Затем я должен декодировать эту строку и записать, что она к выходному файлу как C++ выстраивает с инициализацией от данных данных. Например:

perl myscript.pl DEADBABEDEADBEEF и вывод что-то как

const boost::array<char, 8> MyArray = { 0xDE, 0xAD, 0xBA, 0xBE, 0xDE, 0xAD, 0xBE, 0xEF };

Что правильный путь состоит в том, чтобы сделать это с Perl regex? Конечно, я мог выполнить его в цикле с подстроками, но я полагаю, что должен быть более изящный путь.

Править: входная строка имеет фиксированную длину.

5
задан Haspemulator 16 July 2010 в 11:13
поделиться

3 ответа

Попробуйте следующее:

my $hex = "DEADBABEDEADBEEF";
my @a = map "0x$_", $hex =~ /(..)/g;

Как это работает:

Во-первых, $ hex = ~ /(..)/g в контексте списка захватывает все Подстроки из 2 символов (флаг / g означает глобальное соответствие). Затем map () берет список и преобразует его в другой, используя выражение «0x $ _» для каждого элемента первого списка ( $ _ вот псевдоним элемента).

См. Также perldoc -f map .

6
ответ дан 18 December 2019 в 11:52
поделиться

Как насчет этого:

my $input = $ARGV[0];
die "Fouled up input" unless $input =~ /^(?:[0-9A-F]{2})+$/i;
my $bytes = length ($input) / 2;
print "const boost::array<char, $bytes> MyArray = {";
while ($input =~ s/([0-9A-F]{2})//i) {
    # print $input # to see how this works, see comment.
    print "0x$1, ";
}
print "};\n";
5
ответ дан 18 December 2019 в 11:52
поделиться

Как насчет распаковки?

print join ",", unpack("(A2)*", "DEADBABEDEADBEEF");

Исправление - вам понадобится карта для префикса каждого элемента, возвращаемого при распаковке, с "0x"

print join ",", map { '0x' . $_ } unpack("(A2)*", "DEADBABEDEADBEEF");
4
ответ дан 18 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: