組み合わせる
pdl2 (または Devel::REPL) の perl デバッガー 'x' に相当するものはありますか?
と
特定のスコープ内にあるすべての変数を一覧表示するにはどうすればよいですか?
私のperldlrcを次のように作成しました
use feature ':5.10';
use Data::Dumper;
use PadWalker qw/peek_our peek_my/;
sub x {
my $depth = shift||0;
$Data::Dumper::Maxdepth = $depth;
print Data::Dumper->Dump([@_])
}
sub lvars {
my $vars = in_scope_variables();
print Dumper [keys %$vars];
}
sub in_scope_variables {
my %in_scope = %{peek_our(1)};
my $lexical = peek_my(1);
for my $name (keys %main::) {
my $glob = $main::{$name};
if (defined ${$glob}) {
$in_scope{'$' . $name} = ${$glob};
}
if ( @{$glob}) {
$in_scope{'@' . $name} = [@{$glob}];
}
if (%{$glob}) {
$in_scope{'%' . $name} = {%{$glob}};
}
}
#lexicals hide package variables
while (my ($var, $ref) = each %$lexical) {
$in_scope{$var} = $ref;
}
return \%in_scope;
}
次に、pdl2 を起動しますが、メソッドが機能しません。
$ pdl2
pdl> $xx=in_scope_variables()
Runtime error: You can't FIRSTKEY with the %~ hash at (eval 254) line 38
pdl> lvars
Segmentation fault
ループにコメントした場合
# for my $name (keys %main::) {
# [...]
# }
次に、lvars のみが失敗します。
pdl> $xx=in_scope_variables()
pdl> lvars
Segmentation fault
しかし、pdl2 シェルでコードを直接実行すると動作します
pdl> $xx=in_scope_variables()
pdl> x 1, $xx
$VAR1 = {
'$_REPL' => 'REF(0x19999708)'
};
pdl> print Dumper [keys %$xx];
$VAR1 = [
'$_REPL'
];
この2つのエラーが発生する理由を誰かが知っていますか?
それは pdl2 の問題ですか、Devel::REPL の問題ですか、それとも私が愚かなことをしていますか?
perl 5.12 と Perldl2 Shell v0.005 を使用しています