use strict; use warnings; use Algorithm::Loops qw( Filter ); my $blank = '.'; # or "\xFA"; open(my $fh, '<', @ARGV ? $ARGV[0] : '-') or die("Unable to open input file: $!\n"); binmode($fh); local $/ = \16; while (my $block = <$fh>) { my ($hex) = map { substr($_.(' 'x51), 0, 51) } join ' ', map /.{1,12}/sg, join ' ', map { sprintf '%02X', $_ } map ord, map /./sg, $block; my ($chr) = Filter { s/[^[:print:]]|\s/$blank/sg } $block; print("$hex $chr\n"); }