Perl:使用正则表达式将十六进制编码的字符串解析为数组

时间:2010-07-16 11:06:57

标签: regex perl hex

我对Perl开发很新,我想执行以下任务:

我的脚本接收十六进制编码的字符串作为命令行参数。然后我必须解码这个字符串并将其写入输出文件,就像C ++数组一样,并根据给定的数据进行初始化。例如:

perl myscript.pl DEADBABEDEADBEEF 和输出类似

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

使用Perl正则表达式执行此操作的正确方法是什么?当然,我可以用子串循环执行它,但我相信应该有更优雅的方式。

编辑:输入字符串具有固定长度。

3 个答案:

答案 0 :(得分:6)

试试这个:

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

工作原理:

首先,列表上下文中的$hex =~ /(..)/g捕获所有2个字符的子字符串(/g标志表示全局匹配)。然后map()获取列表并将其转换为另一个列表,使用"0x$_"表达式为第一个列表中的每个元素($_这里是元素的别名)。

另见perldoc -f map

答案 1 :(得分:5)

这个怎么样:

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";

答案 2 :(得分:4)

如何解压?

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

更正 - 您需要一个映射来为解包返回的每个元素添加前缀“0x”

print join ",", map { '0x' . $_ } unpack("(A2)*", "DEADBABEDEADBEEF");