私は次のようなことを行うための最良の、最も簡単な方法を探しています:
$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などの複数の値を保持できるtypeglobであるため、各データ型を確認する必要があります。これを行うコードはここにあります。そのページのコメントは、非グローバル変数( "my"で宣言された字句変数など)の他の解決策を見つけるのに役立つ場合があります。
PadWalkerモジュールは、変数を検索するスコープを決定する LEVEL 引数を取るpeek_my
and which を提供します。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";
}
}
ネイサンの答えは話の一部です - 残念ながら、話の残りの部分は、レキシカル変数が%main::
他のどこにもリストされていないということです(少なくともPerlからアクセス可能な場所ではどこでも - この情報を掘る毛むくじゃらのXSコードを書くことはおそらく可能ですPerl の C レベルの内部から)。
レキシカル変数は、「通常のローカル」変数に通常使用するものです。それらは次のように宣言されます。
my $x;
これはデバッグ目的以外の目的でしょうか? そうでない場合は、perl のデバッガーに慣れる必要があります。デバッガーに入ると、「V」を発行してすべての変数を調べることができます。