1

CGI からデーモンに変換する巨大なシステムがあり、最終的にグローバルになるすべての変数を見つける必要があります ($ で宣言されていない場合など)。しかし、perl ではうっかり忘れてしまっても気にしませんが、今はそうしています。

perl インタプリタは違いを見分けられると思いますが、教えてもらう方法はありますか? すべてのコードを手で調べて宣言を探すこともできますが、このシステムには何千、何千、何千行ものコードがあります。

4

2 に答える 2

4

perldoc strictは、で宣言されていないすべての変数を表示しますmy:

$ perl -Mstrict=vars -c -e '$x=5; my $y=7; $z=6;'
Global symbol "$x" requires explicit package name at -e line 1.
Global symbol "$z" requires explicit package name at -e line 1.
-e had compilation errors.

ファイルのリストと同じこと:

$ perl -Mstrict=vars -c *.pl

perldoc B::Xrefを使用する別の方法を次に示します。

$ perl -MO=Xref -e '$x=5; my $y=7; $z=6;'

... lots of verbose output

  Subroutine (main)
    Package (lexical)
      $y                i1
    Package main
      $x                1
      $z                1
于 2012-05-16T18:43:23.757 に答える
0

PadWalker モジュールを使用すると、特定のスコープ内のすべての変数を表示できます。「my」と「our」で宣言された変数を確認できます。

「use strict」を引き続き使用する必要がありますが、「use strict」を使用しても、グローバルとして宣言したグローバル変数は表示されません。

たとえば、この例にはまだグローバル変数があり、strict は何もしません。

#!/usr/bin/env perl
use strict;
use warnings;
our $foo;

PadWalker を使用すると、このようなものが使用できます。

#!/usr/bin/env perl
use strict;
use warnings;
use DDP;
use PadWalker qw(peek_our);

our $var;

print p peek_our(0);

出力は

\ {
    $var   \ undef
}

確かに、デバッグには PadWalker のみを使用する必要があります。

于 2012-05-18T13:48:12.227 に答える