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などの複数の値を保持できるtypeglobであるため、各データ型を確認する必要があります。これを行うコードはここにあります。そのページのコメントは、非グローバル変数( "my"で宣言された字句変数など)の他の解決策を見つけるのに役立つ場合があります。

于 2009-04-09T18:42:26.293 に答える
6

PadWalkerモジュールは、変数を検索するスコープを決定する LEVEL 引数を取るpeek_myand 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";
    }
}
于 2009-04-09T19:05:01.057 に答える
1

ネイサンの答えは話の一部です - 残念ながら、話の残りの部分は、レキシカル変数が%main::他のどこにもリストされていないということです(少なくともPerlからアクセス可能な場所ではどこでも - この情報を掘る毛むくじゃらのXSコードを書くことはおそらく可能ですPerl の C レベルの内部から)。

レキシカル変数は、「通常のローカル」変数に通常使用するものです。それらは次のように宣言されます。

my $x;
于 2009-04-09T18:55:50.083 に答える
1

これはデバッグ目的以外の目的でしょうか? そうでない場合は、perl のデバッガーに慣れる必要があります。デバッガーに入ると、「V」を発行してすべての変数を調べることができます。

于 2009-04-09T19:40:10.443 に答える