我有一个巨大的系统,我正在从一个cgi转换为一个守护进程,我需要找到所有最终成为全局变量的变量(比如没有用my $声明...)。它们的作用域可能是本地的,但是在Perl中,如果你不小心忘记了,它也不在乎,但是现在我在乎了。我想perl解释器可以分辨出来,那么有没有办法让它告诉我呢?我可以手动检查所有的代码,寻找声明,但是在这个系统中有成千上万的代码行。
my $
z31licg01#
perldoc strict将显示所有未使用my声明的变量:
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
参见strictv -- how unstrict is your code?;这将给予你一个变量的简短摘要。下面是使用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
fafcakar2#
使用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进行调试。
2条答案
按热度按时间z31licg01#
perldoc strict将显示所有未使用
my
声明的变量:对于文件列表也是一样:
参见strictv -- how unstrict is your code?;这将给予你一个变量的简短摘要。
下面是使用perldoc B::Xref的另一种方法
fafcakar2#
使用PadWalker模块,您可以查看特定范围内的所有变量。你可以看到用“my”和“our”声明的变量。
你仍然应该使用“use strict”,但是使用“use strict”不会显示你声明为全局的全局变量。
例如,这个例子仍然有一个全局变量,而strict不做任何事情
有了PadWalker,你可以使用这样的东西。
输出为
当然,你只应该使用PadWalker进行调试。