#! /usr/bin/perl
package main;
{
package Dump;
sub new {
my $pkg = shift;
bless {
file => shift,
},$pkg;
}
sub adrdump {
my $self = shift;
my($adr) = @_;
printf("%08x :",$x);
1;
}
sub hexdump {
my $self = shift;
my($buf) = @_;
my($cnt) = 0;
my($out) = "";
foreach $x (unpack("C*",$buf)) {
$out .= sprintf("- ") if ($cnt == 8);
$out .= sprintf("%02x ",$x);
$cnt++;
}
printf("%-50s",$out);
1;
}
sub chrdump {
my $self = shift;
my($buf,$size) = @_;
my($out) = "";
foreach $x (unpack("C*",$buf)) {
if ((0x00 <= $x && $x <= 0x1f) || 0x7f <= $x) {
$out .= "."
}
else {
$out .= sprintf("%c",$x);
}
}
printf("| %-16s",$out);
1;
}
sub display {
my $self = shift;
my($cnt,$size) = 0;
my($buf) = undef;
if (!open(fp,$self->{file})) {
printf(STDERR "Can't open file[%s]\n",$self->{file});
return(undef);
}
while($size=read(fp,$buf,16)) {
$self->adrdump($adr*16);
$self->hexdump($buf);
$self->chrdump($buf);
printf("\n");
$cnt++;
}
close(fp);
1;
}
}
if (scalar(@ARGV) != 1) {
printf(STDERR "Usage : test02.pl file\n");
exit(1);
}
my $dump = Dump->new(@ARGV[0]);
if (!$dump->display()) {
printf(STDERR "エラー:display()\n");
exit(1);
}
exit(0);
2013年4月5日金曜日
perl でファイルダンプ(クラス風味)
perl のファイルダンプをクラス風味に書き直してみた。perl には例外処理は実装されていないようだ。代わりとなるモジュールやevalがそれに当たるとされているが、代替モジュールは正式サポートされているものでもなく、evalは意味合いが異なる。クラスと継承くらいを利用しておくのが良いのだろう。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿