9

我正在寻找最好、最简单的方法来做类似的事情:

$var1="value";
bunch of code.....
**print allVariablesAndTheirValuesCurrentlyDefined;**
4

5 回答 5

9

包变量?词法变量?

包变量可以通过符号表查找。尝试Devel::Symdump

#!/path/to/perl

use Devel::Symdump;

package example;

$var = "value";
@var = ("value1", "value2");
%var = ("key1" => "value1", "key2" => "value2");

my $obj = Devel::Symdump->new('example');

print $obj->as_string();

词法变量有点小技巧,你不会在符号表中找到它们。可以通过属于定义它们的代码块的“便签本”来查找它们。试试PadWalker

#!/path/to/perl

use strict;
use warnings;

use Data::Dumper;
use PadWalker qw(peek_my);

my $var = "value";
my @var = ("value1", "value2");
my %var = ("key1" =>  "value1", "key2" => "value2");

my $hash_ref = peek_my(0);

print Dumper($hash_ref);
于 2009-04-09T19:36:15.367 回答
7

全局符号表是%main::,因此您可以从那里获取全局变量。但是,每个条目都是一个类型团,可以包含多个值,例如,$x、@x、%x 等,因此您需要检查每种数据类型。您可以在此处找到执行此操作的代码。该页面上的评论可能会帮助您找到非全局变量的其他解决方案(例如用“my”声明的词法变量)。

于 2009-04-09T18:42:26.293 回答
6

PadWalker模块为您提供peek_my一个 LEVEL 参数,peek_our该参数确定在哪个范围内查找变量:

The LEVEL argument is interpreted just like the argument to caller.
So peek_my(0) returns a reference to a hash of all the my variables
that are currently in scope; peek_my(1) returns a reference to a hash
of all the my variables that are in scope at the point where the 
current sub was called, and so on.

这是一个例子:

#!/usr/bin/perl

use strict;
use warnings;

use PadWalker qw/peek_my/;

my $baz = "hi";

foo();

sub foo {
    my $foo = 5;
    my $bar = 10;

    print "I have access to these variables\n";
    my $pad = peek_my(0);
    for my $var (keys %$pad) {
        print "\t$var\n";
    }

    print "and the caller has these variables\n";
    $pad = peek_my(1);
    for my $var (keys %$pad) {
        print "\t$var\n";
    }
}
于 2009-04-09T19:05:01.057 回答
1

Nathan 的回答是故事的一部分——不幸的是,故事的其余部分没有列出词法变量%main::或其他任何地方(至少可以从 Perl 访问的任何地方——可能编写一些毛茸茸的 XS 代码来挖掘这些信息出 Perl 的 C 级内部)。

词法变量通常用于“普通局部”变量。它们的声明如下:

my $x;
于 2009-04-09T18:55:50.083 回答
1

除了调试目的之外,这会用于其他目的吗?如果没有,您可能需要熟悉perl 的调试器。一旦进入调试器,您可以通过发出“V”来检查所有变量。

于 2009-04-09T19:40:10.443 回答