我对Perl开发很新,我想执行以下任务:
我的脚本接收十六进制编码的字符串作为命令行参数。然后我必须解码这个字符串并将其写入输出文件,就像C ++数组一样,并根据给定的数据进行初始化。例如:
perl myscript.pl DEADBABEDEADBEEF
和输出类似
const boost::array<char, 8> MyArray = { 0xDE, 0xAD, 0xBA, 0xBE, 0xDE, 0xAD, 0xBE, 0xEF };
使用Perl正则表达式执行此操作的正确方法是什么?当然,我可以用子串循环执行它,但我相信应该有更优雅的方式。
编辑:输入字符串具有固定长度。
答案 0 :(得分:6)
试试这个:
my $hex = "DEADBABEDEADBEEF";
my @a = map "0x$_", $hex =~ /(..)/g;
工作原理:
首先,列表上下文中的$hex =~ /(..)/g
捕获所有2个字符的子字符串(/g
标志表示全局匹配)。然后map()
获取列表并将其转换为另一个列表,使用"0x$_"
表达式为第一个列表中的每个元素($_
这里是元素的别名)。
答案 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");