在Perl中将数据打印为十六进制转储

3

我想在perl中以十六进制转储的形式打印数据,但是似乎只有在将变量硬编码为十六进制转储值时才有效。在下面的代码中,第一个案例可以打印出十六进制转储,但是对于第二个案例($var2),它只打印从文件句柄读取的数据。

#!/usr/bin/perl
use Data::Dumper;
$var = "\xE9\x92\x97\xAF\xE9\x92\x97\xB5";
print "the first dumper is\n";
print Dumper($var);
my $filename = 'c.txt';
open($fh, "<", $filename);
{
local $/;
$var2 = <$fh>;
chop($var2);
}
close($fh);
$var5 = $var2;
print "the second dumper is\n";
print Dumper($var5);

以上代码的输出结果是:
[root@abc]# perl code.pl 

第一个转储程序是

$VAR1 = 'é’—¯é’—µ';

第二个转储程序是:
$VAR1 = '"\\xE9\\x92\\x97\\xAF\\xE9\\x92\\x97\\xB5"';

看起来perl在文件句柄输入中每个斜杠都附加了一个额外的反斜杠。我该如何将文件句柄数据打印为十六进制转储?c.txt文件的内容如下:

[root@abc]# cat c.txt 
"\xE9\x92\x97\xAF\xE9\x92\x97\xB5"

1
我认为您想要使用pack和unpack,http://perldoc.perl.org/perlpacktut.html。但我有困难弄清楚您是想要第一种输出还是第二种输出。或者您只是想弄清楚发生了什么? - Dan Walmsley
@丹,我想要第一个输出。 - user2896215
1个回答

1

好的,你可以这样做

#!/usr/bin/perl
use Data::Dumper;
$var = "\xE9\x92\x97\xAF\xE9\x92\x97\xB5";
print "the first dumper is\n";
print Dumper($var);
my $filename = 'c.txt';
open($fh, "<", $filename);
{
local $/;
$var2 = <$fh>;
chop($var2);
}
close($fh);
$var5 = $var2;
$var5 =~ s/"|\\x//g;
print "the second dumper is\n";
print Dumper(pack("H*",$var5));

我正在使用搜索和替换功能,以删除所有的 " 字符和 \x ,因为它们只是用来帮助使其更易读的垃圾。然后将其打包为十六进制字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接