Perl: разобрать шестнадцатеричную строку в массив с помощью регулярного выражения - PullRequest
5 голосов
/ 16 июля 2010

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

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

perl myscript.pl DEADBABEDEADBEEF и вывод что-то вроде

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

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

РЕДАКТИРОВАТЬ: входная строка имеет фиксированную длину.

Ответы [ 3 ]

6 голосов
/ 16 июля 2010

Попробуйте это:

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

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

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

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

5 голосов
/ 16 июля 2010

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

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";
4 голосов
/ 16 июля 2010

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

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

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

print join ",", map { '0x' . $_ } unpack("(A2)*", "DEADBABEDEADBEEF");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...