Perl: parse hex-encoded string into array with regex
I'm quite new to Perl development, and I'd like to perform a following task:
My script receives hex-encoded string as command-line param. Then I must decode this string and write it to output file like a C++ array with initialization from data given. For example:
perl myscript.pl DEADBABEDEADBEEF
and the output something like
const boost::array<char, 8> MyArray = { 0xDE, 0xAD, 0xBA, 0xBE, 0xDE, 0xAD, 0x开发者_StackOverflowBE, 0xEF };
What is the right way to do this with Perl regex? Of course, I could perform it in loop with substrings, but I believe that there should be more elegant way.
EDIT: the input string is of fixed length.
Try this:
my $hex = "DEADBABEDEADBEEF";
my @a = map "0x$_", $hex =~ /(..)/g;
How it works:
First, $hex =~ /(..)/g
in list context captures all 2-character substrings (the /g
flag means global match). Then map()
takes the list and transforms it to another one, using the "0x$_"
expression for each element of the first list ($_
here is an alias for the element).
See also perldoc -f map.
How about this:
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";
How about unpack?
print join ",", unpack("(A2)*", "DEADBABEDEADBEEF");
Correction - you'd need a map to prefix each element that unpack returns with a "0x"
print join ",", map { '0x' . $_ } unpack("(A2)*", "DEADBABEDEADBEEF");
精彩评论