Or even faster (don't change things that don't need changing):
my $string = "abc12defghi\013jkl";
(my $copy = $string) =~ s/([^[:print:]])/sprintf " (0x%02x) ", ord $1/
+ge;
print $copy;
-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply. | [reply] [d/l] |
Thank you, modified my code to include your split //. However, I choose not to use :print:, as that would have problem with Unicode, instead I added ‘use bytes’ to my code.
I still like my own output format better ;-), but I added code to allow user to configure the format (a little bit).
package StringInspector;
use Hash::Util qw(lock_keys);
use strict;
sub new {
my $self = {};
$self->{SUSPECT} = "";
$self->{BYTES_IN_ROW} = 10;
$self->{COLUMNS_BETWEEN_PANES} = 5;
bless $self;
lock_keys(%{$self});
return $self;
}
sub inspect {
my ($self, $string) = @_;
$self->{SUSPECT} = $string;
}
sub bytes_in_row {
my $self = shift;
if (@_) {
$self->{BYTES_IN_ROW} = shift;
}
return $self->{BYTES_IN_ROW};
}
sub columns_between_panes {
my $self = shift;
if (@_) {
$self->{COLUMNS_BETWEEN_PANES} = shift;
}
return $self->{COLUMNS_BETWEEN_PANES};
}
sub display {
use bytes;
my $self = shift;
for (my $index = 0; $index <= length $self->{SUSPECT}; $index += $
+self->{BYTES_IN_ROW}) {
my ($numbers, $chars) = ("", "");
foreach my $this_char (split(//, substr($self->{SUSPECT}, $ind
+ex, $self->{BYTES_IN_ROW}))) {
my $ascii = ord($this_char);
$numbers .= sprintf("0x%0x ", $ascii);
$chars .= (($ascii >= 32) and ($ascii <= 126)) ? $this_cha
+r : ".";
}
print $numbers;
print " " x (6 * $self->{BYTES_IN_ROW} - length $numbers);
print " " x $self->{COLUMNS_BETWEEN_PANES};
print $chars;
print "\n";
}
}
1;
testing code:
use StringInspector;
use strict;
my $inspector = new StringInspector;
$inspector->bytes_in_row(3);
$inspector->columns_between_panes(40);
$inspector->inspect("abcdefghi" . chr(400) ."jkl");
$inspector->display();
| [reply] [d/l] |