さよなら? Data::Dumper。初めまして Debug::Dumper
いつも Data::Dumper モジュールにはソースを Read/Write する時にお世話になっているんだけど,色々不満があったので Debug::Dumper というモジュールを書きました。
Data::Dumper モジュールで不満だったのは特に以下の 2 点。
- 出力内容の encode 指定が出来ないので,自分でエンコード処理を書く必要がある
- 毎回 $Data::Dumper::Indent = 1; とか書くのは面倒。デフォルト 1 で良くね?
package Debug::Dumper; use strict; use warnings; use Data::Dumper; use Dumpvalue; use IO::Scalar; use Encode (); use Term::Encoding; sub new { my ($class, %opt) = @_; my $self = bless { encoding => $opt{encoding} || Term::Encoding::get_encoding, indent => $opt{indent} || 1, purity => $opt{purity} || 1, }, $class; $Data::Dumper::Indent = $self->{indent}; $Data::Dumper::Purity = $self->{purity}; return $self; } sub p { my ($self, $data) = @_; my $dump_str = Data::Dumper::Dumper($data); return $self->encode($dump_str); } sub pp { my ($self, $data) = @_; my $io = IO::Scalar->new(\my $dump_str); my $oio = select($io); Dumpvalue->new->dumpValue($data); select($oio); return $self->encode($dump_str); } sub encode { my ($self, $dump_str) = @_; $dump_str =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg; return Encode::encode($self->{encoding}, $dump_str); } 1; # <使い方> # # use XML::Simple; # use Debug::Dumper; # # my $data = XMLin 'rss.xml'; # # my $dumper = Debug::Dumper->new; # print $dumper->p($data); # print $dumper->pp($data);
<改善点>
なぜか $dumper->p $data; と書くと,以下のように怒られる。
Scalar found where operator expected at ./try.pl line 11, near "->p $data" (Missing operator before $data?) syntax error at ./try.pl line 11, near "->p $data" Execution of ./try.pl aborted due to compilation errors.
なんでだろ?
<追記>
メソッド p() or pp() の引数として渡すデータは,perl の内部形式(Internal format) にエンコードされている必要があります。
必要に応じて deocde() したデータを渡してやる必要があります。