我正在寻找最好,最简单的方法来做:
$var1="value";
bunch of code.....
**print allVariablesAndTheirValuesCurrentlyDefined;**
答案 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_my
和peek_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'来检查所有变量。