发现Perl应用程序当前定义的所有变量的最佳方法是什么?

时间:2009-04-09 18:27:41

标签: perl metaprogramming metadata

我正在寻找最好,最简单的方法来做:

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

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:7)

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

答案 2 :(得分:6)

PadWalker模块为您提供peek_mypeek_our,它们采用LEVEL参数来确定在哪个范围内查找变量:

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";
    }
}

答案 3 :(得分:1)

Nathan's answer是故事的一部分 - 不幸的是,故事的其余部分是词汇变量未在%main::或其他任何地方列出(至少在Perl可以访问的地方 - 它可能是可以编写一些毛茸茸的XS代码,从Perl的C级内部挖掘出这些信息。)

词法变量是您通常用于“普通本地”变量的变量。他们被宣布为:

my $x;

答案 4 :(得分:1)

这是否适用于调试以外的任何其他目的?如果没有,您可能需要熟悉perl's debugger。进入调试器后,您可以通过发出'V'来检查所有变量。