有没有办法让Perl解释器列出pl文件中的所有全局变量?

时间:2012-05-16 18:27:38

标签: perl global-variables

我有一个巨大的系统,我正在从一个cgi转换为一个守护进程,我需要找到所有最终都是全局的变量(就像我的$ ...没有声明一样) 它们可能是本地的,但如果你不小心忘记它们,它就不会关心,但是现在我做了。

我必须认为perl解释器可以区分,所以有没有办法让它告诉我?我可以手工查看所有代码,查找声明,但是在这个系统中有成千上万行代码。

2 个答案:

答案 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进行调试。