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

Has*_*tor 5 regex perl hex

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

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

perl myscript.pl DEADBABEDEADBEEF 和输出的东西一样

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

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

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

Eug*_*ash 6

试试这个:

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

这个怎么运作:

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

另见perldoc -f map.


小智 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";
Run Code Online (Sandbox Code Playgroud)