Data::Dumper - perlデータ構造の出力/eval両用文字列化

目次


名前

Data::Dumper - perlデータ構造の出力/eval両用文字列化


概要

    use Data::Dumper;

    # simple procedural interface
    # 簡単な関数的インターフェース
    print Dumper($foo, $bar);

    # extended usage with names
    # 名前付きの拡張用法
    print Data::Dumper->Dump([$foo, $bar], [qw(foo *ary)]);

    # configuration variables
    # 設定変数
    {
      local $Data::Dumper::Purity = 1;
      eval Data::Dumper->Dump([$foo, $bar], [qw(foo *ary)]);
    }

    # OO usage
    # OO 用法
    $d = Data::Dumper->new([$foo, $bar], [qw(foo *ary)]);
       ...
    print $d->Dump;
       ...
    $d->Purity(1)->Terse(1)->Deepcopy(1);
    eval $d->Dump;

説明

スカラーやリファレンス変数のリストを与えるとその内容を perl 構文の形式で 書き出します. リファレンスはオブジェクトであってもかまいません. 書く変数の内容は1つの Perl 文として出力されます. 自己参照している 構造も適切に扱えます.

返される値は eval して元々参照したものと同一の複製にもどすことが できます.

渡されたもののいずれかと同じリファレンスは $VARn (nは数値の サフィックス) となり, $VARn の中の部分構造への重複したリファレンス 矢印記法を用いて適切にラベル付けされます. Dump() メソッドを 用いたり, $VAR プレフィックスをデフォルトから他の何かに変えることで ダンプされる個々の値の名前を指定することもできます. 後述の $Data::Dumper::Varname 及び $Data::Dumper::Terse を 参照してください.

自己参照している構造のデフォルトの出力は eval することができますが, $VARn へのネストしたリファレンスは, 再帰した構造をPerl文1つで 構築できないために未定義です. これらのリファレンスを正しく出力するには Purity フラグに 1 を設定して複数の文での出力を行う必要があります.

拡張用法形式では, ダンプされるリファレンスはユーザが指定した名前と共に 与えることができます. 名前が * で始まっていると出力は供給された ハッシュ, 配列, コードリファレンスをデリファレンスした型で記述します. Terse フラグを設定したときは可能な場所であれば名前の出力が抑制されます.

オブジェクトの内部状態を設定するために使われる関数の多くはオブジェクト 自身を返します. これはメソッドを連続して呼び出すのに便利です.

Indent フラグを設定することでいくつかの出力形式が利用できます. 詳細は後述の 設定変数及びメソッド を参照してください.

メソッド

PACKAGE->new(ARRAYREF [, ARRAYREF])

新しく Data::Dumper オブジェクトを生成して返します. 最初の引数はダンプしたい値の配列へのリファレンスです. 2番目の引数は省略可能で, 値に対応する名前を配列への引数で 渡します. 名前は $ で始まっていなくてもかまいません. しかし英数文字で構成されていなければなりません. 名前を * で始めることで ARRAY や HASH リファレンスに対してリファレンスではなくデリファレンスされた 型でダンプさせることができます.

値に対応する名前が未定義だったときには, $Data::Dumper::Varname で指定されたプレフィックスに数値を追加したものが 使われます.

Data::Dumper は値をダンプした際に見つけたすべてのリファレンスを 取り出します. クロスリファレンス (perl構文において部分構造の名前の 形式での)が発生する地点に挿入されます. これによって元の値の集合での 構造が維持されます. 構造の走査順は深さ優先です. そして(newメソッドに) 最初に供給された値から最後に供給されたものの順で処理されていきます.

$OBJ->Dump or PACKAGE->Dump(ARRAYREF [, ARRAYREF])

オブジェクトに格納された値の文字列形式を返します((Data::Dumperの)newに 渡された順番が維持されます). 後述する設定オプションの影響を受けます. リストコンテキストでは供給された値に対応する文字列をリストで返します.

2番目の形式では, これはより便利な形式で, 与えられた引数を使って オブジェクトを直にダンプする前に単純に new を呼び出します.

$OBJ->Seen([HASHREF])

これまでに遭遇したリファレンスの内部テーブルを問い合わせもしくは 追加します. 必要であるのなら, 明示的にテーブルをクリアするために Reset を使わなければなりません. その様なリファレンスはダンプされず, サブクエリでそれらに遭遇した箇所には代わりに名前がダンプされます. これは特にサブルーティンリファレンスを適切にダンプするのに用います.

名前 => 値ペアの無名ハッシュは例外です. 同じルールが new での名前に 適用されます. もし引数がなのも渡されなければ, リストコンテキストにおいては 名前 => 値ペアの "既出" リストが返されます. そうでなければ オブジェクト自身が返されます.

$OBJ->Values([ARRAYREF])

ダンプされる値の内部リストを取得もしくは置換します. 引数無しで呼ばれたときには値を返し, そうでなければ オブジェクト自身を返します.

$OBJ->Names([ARRAYREF])

ダンプされる値に対応してユーザが指定した名前の内部リストを取得 もしくは置換します. 引数無しで呼ばれたときには名前を, そうでなければ オブジェクト自身を返します.

$OBJ->Reset

"既出" リファレンスの内部テーブルをクリアし, オブジェクト自身を返します.

関数

Dumper(LIST)

渡されたリストの値を文字列化して返します. 後述の設定オプションが適用 されます. 値の名前には $VARn が使われます. n は 数値のサフィックスです. リストコンテキストでは文字列のリストを返します.

設定変数及びメソッド

いくつかの設定変数は関数インターフェースを使って生成される出力の コントロールに使うことができます. これらの変数は変更してもコードの 他の部分に副作用をもたらさないように大抵は local して使います.

これらの変数は new メソッドを呼び出して作成されたオブジェクトの 初期状態を決定します. しかしそれ以降のオブジェクトの状態を変えることは できません. (訳注: new の時点で初期状態が取り込まれ, それ以降は 設定変数を変更してもオブジェクトには影響しない.) オブジェクトの 内部状態を取得若しくは設定するには同じ名前のメソッドを使います.

メソッド形式は引数をつけて呼び出したときにはオブジェクト自身を返します. これはメソッドを連続して呼び出すのに便利です.

エクスポート

Dumper

以下のコード片を実行することでこのモジュールの振る舞いをささっと 感じ取ることができます. これらの例を読み終える頃にはこれまでに説明 してきた設定変数を追加・変更したくなっているでしょう. (さらに 多くの例については Data::Dumper 配布物に含まれているテストスイートも 参照してみてください.)

    use Data::Dumper;

    package Foo;
    sub new {bless {'a' => 1, 'b' => sub { return "foo" }}, $_[0]};

    package Fuz;                       # a weird REF-REF-SCALAR object
    sub new {bless \($_ = \ 'fu\'z'), $_[0]};

    package main;
    $foo = Foo->new;
    $fuz = Fuz->new;
    $boo = [ 1, [], "abcd", \*foo,
             {1 => 'a', 023 => 'b', 0x45 => 'c'}, 
             \\"p\q\'r", $foo, $fuz];

    ########
    # simple usage
    # 簡単な使用方法
    ########

    $bar = eval(Dumper($boo));
    print($@) if $@;
    print Dumper($boo), Dumper($bar);  # pretty print (no array indices)
                                       # 小洒落た表示(配列の添字のの省略)

    $Data::Dumper::Terse = 1;          # don't output names where feasible
                                       # 可能であれば名前表示の抑制
    $Data::Dumper::Indent = 0;         # turn off all pretty print
                                       # 整形表示の解消
    print Dumper($boo), "\n";

    $Data::Dumper::Indent = 1;         # mild pretty print
                                       # 幾分きれいな出力
    print Dumper($boo);

    $Data::Dumper::Indent = 3;         # pretty print with array indices
                                       # 配列の添字付きで整形出力
    print Dumper($boo);

    $Data::Dumper::Useqq = 1;          # print strings in double quotes
                                       # ダブルクオートで文字列を表示
    print Dumper($boo);

    $Data::Dumper::Pair = " : ";       # specify hash key/value separator
                                       # ハッシュのキー/値分離記号の指定
    print Dumper($boo);

    ########
    # recursive structures
    # 再帰的な構造
    ########

    @c = ('c');
    $c = \@c;
    $b = {};
    $a = [1, $b, $c];
    $b->{a} = $a;
    $b->{b} = $a->[1];
    $b->{c} = $a->[2];
    print Data::Dumper->Dump([$a,$b,$c], [qw(a b c)]);

    $Data::Dumper::Purity = 1;         # fill in the holes for eval
                                       # eval 用の隙間埋め
    print Data::Dumper->Dump([$a, $b], [qw(*a b)]); # print as @a
                                                    # @a で表示
    print Data::Dumper->Dump([$b, $a], [qw(*b a)]); # print as %b
                                                    # %b で表示

    $Data::Dumper::Deepcopy = 1;       # avoid cross-refs
                                       # クロスリファレンスの回避
    print Data::Dumper->Dump([$b, $a], [qw(*b a)]);

    $Data::Dumper::Purity = 0;         # avoid cross-refs
                                       # クロスリファレンスの回避
    print Data::Dumper->Dump([$b, $a], [qw(*b a)]);

    ########
    # deep structures
    # 深い構造
    ########

    $a = "pearl";
    $b = [ $a ];
    $c = { 'b' => $b };
    $d = [ $c ];
    $e = { 'd' => $d };
    $f = { 'e' => $e };
    print Data::Dumper->Dump([$f], [qw(f)]);

    $Data::Dumper::Maxdepth = 3;       # no deeper than 3 refs down
                                       # 3つより深く行かない
    print Data::Dumper->Dump([$f], [qw(f)]);

    ########
    # object-oriented usage
    # オブジェクト指向的な使い方
    ########

    $d = Data::Dumper->new([$a,$b], [qw(a b)]);
    $d->Seen({'*c' => $c});            # stash a ref without printing it
                                       # 表示なしでリファレンスを取り置き
    $d->Indent(3);
    print $d->Dump;
    $d->Reset->Purity(0);              # empty the seen cache
                                       # 既出キャッシュのクリア
    print join "----\n", $d->Dump;

    ########
    # persistence
    # 持続
    ########

    package Foo;
    sub new { bless { state => 'awake' }, shift }
    sub Freeze {
        my $s = shift;
	print STDERR "preparing to sleep\n";
	$s->{state} = 'asleep';
	return bless $s, 'Foo::ZZZ';
    }

    package Foo::ZZZ;
    sub Thaw {
        my $s = shift;
	print STDERR "waking up\n";
	$s->{state} = 'awake';
	return bless $s, 'Foo';
    }

    package Foo;
    use Data::Dumper;
    $a = Foo->new;
    $b = Data::Dumper->new([$a], ['c']);
    $b->Freezer('Freeze');
    $b->Toaster('Thaw');
    $c = $b->Dump;
    print $c;
    $d = eval $c;
    print Data::Dumper->Dump([$d], ['d']);

    ########
    # symbol substitution (useful for recreating CODE refs)
    # シンボル置換 (CODEリファレンスの再構築に便利)
    ########

    sub foo { print "foo speaking\n" }
    *other = \&foo;
    $bar = [ \&other ];
    $d = Data::Dumper->new([\&other,$bar],['*other','bar']);
    $d->Seen({ '*foo' => \&foo });
    print $d->Dump;

    ########
    # sorting and filtering hash keys
    # ハッシュキーのソートとフィルタ
    ########

    $Data::Dumper::Sortkeys = \&my_filter;
    my $foo = { map { (ord, "$_$_$_") } 'I'..'Q' };
    my $bar = { %$foo };
    my $baz = { reverse %$foo };
    print Dumper [ $foo, $bar, $baz ];

    sub my_filter {
        my ($hash) = @_;
        # return an array ref containing the hash keys to dump
        # in the order that you want them to be dumped
        # ダンプしたい順番でダンプするハッシュのキーを含んだ
        # 配列へのリファレンスを返す
        return [
          # Sort the keys of %$foo in reverse numeric order
          # 数値降順で %$foo のキーをソート
            $hash eq $foo ? (sort {$b <=> $a} keys %$hash) :
          # Only dump the odd number keys of %$bar
          # %$bar の奇数番目のキーのみをダンプ
            $hash eq $bar ? (grep {$_ % 2} keys %$hash) :
          # Sort keys in default order for all other hashes
          # それ以外はデフォルトの順番
            (sort keys %$hash)
        ];
    }

バグ

Perl のサブルーティン呼び出しのセマンティクス上の制限から, 配列や ハッシュを渡すことはできません. \ を前置することでそのリファレンスを 替わりに渡すことはできます. これは間に合わせの応急処置です, いまの Perl にはサブルーティンプロトタイプがあります. 今のところはハッシュや配列を出力するには拡張形式を使って名前の前に * を置く必要があります.

Data::Dumper は CODE リファレンスを簡略化します. 処理している 構造の中でコードリファレンスが見つかると(かつ Deparse フラグが 設定されていないと), 文字列 "DUMMY" を含んだ無名関数がそこに 生成され, Purity が設定されていると警告が表示されます. 生成された結果は eval することができますが, 作成された無名関数が プレースホルダのように記憶されているだけです. いつの日か, perl がコードのコンパイルされた断片の文字列形式を必要に応じて キャッシュするように切り替わることを祈ります. データを構成している すべてのコードリファレンスに対してそれがどういうものかより知っているのなら 内部リファレンステーブルに先に種をまいておくために Seen メソッドを 使うことができ, そしてダンプされる出力で代わりにそれを指すように できます(訳注:この1文ちょっと不明). 前述の "EXAMPLES" を参照してください.

Useqq 及び Deparse フラグは Dump() の実行を遅くさせます. これはこれらには XSUB 実装がサポートされていないためです.

SCALAR オブジェクトは奇妙な bless 検出動作をします(訳注:この文も ちょっと不明).

Dat::Dumper の pure Perl バージョンは, Perl 5.8.0 及びそれ以降でのみ UTF-8 文字列を適切にエスケープします.

留意事項

Perl 5.8.1 から, Perl の実行毎に異なるハッシュキー順序を持ちます. この変更はセキュリティの大きな向上となります. "Algorithmic Complexity Attacks" in perlsec を参照してください. これはデータにハッシュを含んでいる場合には Perl の実行毎に 異なる出力となることを意味します. もし Perl の別々の実行 毎でも同じ Data::Dumper 出力を必要とするのなら, PERL_HASH_SEED を使うこともできます, これに関しては "PERL_HASH_SEED" in perlrun を参照してください. これを使うことで以前の(プラットフォーム依存の)順序に戻せます. しかしもっと優れた解決方法は Data::Dumper の Sortkeys フィルタを 使うことでしょう.


著者

Gurusamy Sarathy gsar@activestate.com

Copyright (c) 1996-98 Gurusamy Sarathy. All rights reserved. このプログラムはフリーソフトウェアです. このプログラムは Perl 自身と 同じ条件下で再配布・改変可能です.


バージョン

Version 2.121 (Aug 24 2003)


関連項目

perl(1)


和訳

 山科 氷魚 (YAMASHINA Hio) <hio@hio.jp>

Data::Dumper - perlデータ構造の出力/eval両用文字列化

索引

Data::Dumper - perlデータ構造の出力/eval両用文字列化