我正在寻找最好、最简单的方法来做类似的事情:
$var1="value";
bunch of code.....
**print allVariablesAndTheirValuesCurrentlyDefined;**
我正在寻找最好、最简单的方法来做类似的事情:
$var1="value";
bunch of code.....
**print allVariablesAndTheirValuesCurrentlyDefined;**
包变量?词法变量?
包变量可以通过符号表查找。尝试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);
全局符号表是%main::
,因此您可以从那里获取全局变量。但是,每个条目都是一个类型团,可以包含多个值,例如,$x、@x、%x 等,因此您需要检查每种数据类型。您可以在此处找到执行此操作的代码。该页面上的评论可能会帮助您找到非全局变量的其他解决方案(例如用“my”声明的词法变量)。
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";
}
}
Nathan 的回答是故事的一部分——不幸的是,故事的其余部分没有列出词法变量%main::
或其他任何地方(至少可以从 Perl 访问的任何地方——可能编写一些毛茸茸的 XS 代码来挖掘这些信息出 Perl 的 C 级内部)。
词法变量通常用于“普通局部”变量。它们的声明如下:
my $x;
除了调试目的之外,这会用于其他目的吗?如果没有,您可能需要熟悉perl 的调试器。一旦进入调试器,您可以通过发出“V”来检查所有变量。