我有一个巨大的系统,我正在从一个cgi转换为一个守护进程,我需要找到所有最终都是全局的变量(就像我的$ ...没有声明一样) 它们可能是本地的,但如果你不小心忘记它们,它就不会关心,但是现在我做了。
我必须认为perl解释器可以区分,所以有没有办法让它告诉我?我可以手工查看所有代码,查找声明,但是在这个系统中有成千上万行代码。
答案 0 :(得分: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
答案 1 :(得分: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进行调试。