user2896215 user2896215 - 2 months ago 10
Perl Question

printing data as hexdump in perl

I am trying to print data as hexdump in perl but looks like its only working when i am "hard coding" the variable with hex dump value. In below code, hexdump is printed for first case but for second case ($var2), it just prints the data that is read from the file handle

#!/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);


The output of above code is

[root@abc]# perl code.pl

the first dumper is

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

the second dumper is

$VAR1 = '"\xE9\x92\x97\xAF\xE9\x92\x97\xB5"';

It looks like perl is appending an extra backslash with every slash present in the filehandle input. How can i print the file handle data as hexdump? The contents of c.txt file are

[root@abc]# cat c.txt

"\xE9\x92\x97\xAF\xE9\x92\x97\xB5"

Answer

Well you can do this

#!/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));

I'm using search and replace to remove all the " chars and the \x as these are just cruft used to help make it human readable. Then pack it as a hex string.