さよなら? 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() したデータを渡してやる必要があります。