我有一个巨大的系统,我正在从 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
$ 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 进行调试。