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 shell 中运行代码,它就可以工作

pdl> $xx=in_scope_variables()
pdl> x 1, $xx        
$VAR1 = {
          '$_REPL' => 'REF(0x19999708)'
        };
pdl> print Dumper [keys %$xx];  
$VAR1 = [
          '$_REPL'
        ];

有人知道为什么会发生这两个错误吗?

这是一个 pdl2 问题,是一个 Devel::REPL 问题还是我在做一些愚蠢的事情?

我正在使用 perl 5.12 和 Perldl2 Shell v0.005

4

1 回答 1

1
  • 解决了分段错误:

我已经更新了我一岁的 PadWalker 版本,现在使用 PadWalker-1.92 可以正常工作。

不幸的是,我在更新之前没有写下我的版本,所以我无法报告哪个版本有问题。

  • 仍在等待%main::变量捕获中的错误:

    运行时错误:您不能在 (eval 254) 第 38 行使用 %~ 散列 FIRSTKEY

于 2011-07-08T21:33:26.020 回答