CGI からデーモンに変換する巨大なシステムがあり、最終的にグローバルになるすべての変数を見つける必要があります ($ で宣言されていない場合など)。しかし、perl ではうっかり忘れてしまっても気にしませんが、今はそうしています。
perl インタプリタは違いを見分けられると思いますが、教えてもらう方法はありますか? すべてのコードを手で調べて宣言を探すこともできますが、このシステムには何千、何千、何千行ものコードがあります。
CGI からデーモンに変換する巨大なシステムがあり、最終的にグローバルになるすべての変数を見つける必要があります ($ で宣言されていない場合など)。しかし、perl ではうっかり忘れてしまっても気にしませんが、今はそうしています。
perl インタプリタは違いを見分けられると思いますが、教えてもらう方法はありますか? すべてのコードを手で調べて宣言を探すこともできますが、このシステムには何千、何千、何千行ものコードがあります。
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
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 のみを使用する必要があります。