1

我有一个巨大的系统,我正在从 cgi 转换为守护程序,我需要找到所有最终成为全局变量(如未用我的 $... 声明)它们可能打算在本地范围内,但是在 perl 中,如果你不小心忘记了,它并不在乎,但现在我愿意。

我想perl解释器可以区分,那么有没有办法让它告诉我?我可以手动浏览所有代码,寻找声明,但是这个系统中有成千上万行代码。

4

2 回答 2

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
于 2012-05-16T18:43:23.757 回答
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 进行调试。

于 2012-05-18T13:48:12.227 回答