クロージャにバインドされた値を見たい時
Moose/Mouseのmethod modifiersのようにクロージャを多用するプログラミングをしていると、バインドしている変数の中身も含めてDeparseしたいことがよくあります。
そういうケースでは、Data::Dump::Streamerが使えます。
#!perl -w use strict; use feature qw(say); use Data::Dump::Streamer qw(Dump); sub make_counter { my $i = shift || 0; return sub { $i++ }; } my $x = make_counter(); my $y = make_counter(10); say "# x-1:"; Dump $x; say "# y-1:"; Dump $y; $x->(); $y->(); say "# x-2:"; Dump $x; say "# y-2:"; Dump $y; __END__
結果:
# x-1: my ($i); $i = 0; $CODE1 = sub { use strict 'refs'; BEGIN { $^H{'feature_say'} = q(1); } $i++; }; # y-1: my ($i); $i = 10; $CODE1 = sub { use strict 'refs'; BEGIN { $^H{'feature_say'} = q(1); } $i++; }; # x-2: my ($i); $i = 1; $CODE1 = sub { use strict 'refs'; BEGIN { $^H{'feature_say'} = q(1); } $i++; }; # y-2: my ($i); $i = 11; $CODE1 = sub { use strict 'refs'; BEGIN { $^H{'feature_say'} = q(1); } $i++; };
実行に影響を与えるプラグマが少し邪魔ですが、無事バインドした変数の中身ごと出力されました。
なお、このモジュールにはPerlの内部構造に依存したコードが大量に含まれるため、最新のPerlでは動かなかったりします。しかし、デバッグに使うなら問題ないことも多いです。今回はテストが一部通らなかったのでcpanm -nで入れました。