Data::Dumper を使ってデータ構造を覗き見る

perlでプログラムデバック時に Data::Dumper を使って変数内のデータ構造を見たいことがあると思います。

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my $var = {
    array => [1,2,3],
    hash => {
        key1 => "val1", 
        key2 => "val2"
    },
    coderef => sub { "this is coderef"}
};

print Dumper $var;

普通のarrayやhashであれば dumper メソッドを使い構造を確かめることはできますがcode reference(コードリファレンス)を見ようとすると sub { "DUMMY" } となってしまい内容が分からず枕を涙で濡らすことになってしまいます。

$VAR1 = {
          'hash' => {
                      'key2' => 'val2',
                      'key1' => 'val1'
                    },
          'array' => [
                       1,
                       2,
                       3
                     ],
          'coderef' => sub { "DUMMY" }
        };

コードリファレンス内部を覗く3つの方法

その1 B::Deparse を使う方法

404 Blog Not Found perl - B::Deparse で書かれている方法ですね。

use B::Deparse;
my $coderef = sub { print "this is coderef"};
my $bd = B::Deparse->new;
print $bd->coderef2text($coderef);

Result

{
    use warnings;
    use strict 'refs';
    print 'this is coderef';
}

その2 Data::Dumper::Concise を使う方法

Data::Dumper::Concise を use して Dumper メソッドを呼ぶだけで簡単ですね。普通の Dumper と違うのはhashのキーもソートしてくれる所

use Data::Dumper::Concise;

print Data::Dumper::Concise::Dumper $var;

Result

{
  array => [
    1,
    2,
    3
  ],
  coderef => sub {
      use warnings;
      use strict 'refs';
      print 'this is coderef';
  },
  hash => {
    key1 => "val1",
    key2 => "val2"
  }
}

その3 Data::Dumper を使う方法

通常の使い方に $Data::Dumper::Deparse = 1 を追加するだけで coderef の中身まで見えるようになります。

use Data::Dumper;
{
    local $Data::Dumper::Deparse = 1;
    print Data::Dumper::Dumper $var;
}

Result

$VAR1 = {
          'hash' => {
                      'key2' => 'val2',
                      'key1' => 'val1'
                    },
          'array' => [
                       1,
                       2,
                       3
                     ],
          'coderef' => sub {
                           use warnings;
                           use strict 'refs';
                           print 'this is coderef';
                       }
        };
created:

Back to top