1

組み合わせる

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 を使用しています

4

1 に答える 1

1
  • セグメンテーション違反を解決しました:

1 年前の PadWalker バージョンを更新しましたが、現在は PadWalker-1.92 で問題なく動作しています。

残念ながら、更新前に自分のバージョンを書き留めていなかったため、どのバージョンで問題が発生したかを報告できません。

  • %main::変数のキャプチャでまだエラーが保留中です:

    実行時エラー: (eval 254) 行 38 で %~ ハッシュを使用して FIRSTKEY を実行することはできません

于 2011-07-08T21:33:26.020 に答える