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

bis0qfac  于 2023-05-23  发布在  Perl
关注(0)|答案(2)|浏览(145)

我有一个巨大的系统,我正在从一个cgi转换为一个守护进程,我需要找到所有最终成为全局变量的变量(比如没有用my $声明...)。它们的作用域可能是本地的,但是在Perl中,如果你不小心忘记了,它也不在乎,但是现在我在乎了。
我想perl解释器可以分辨出来,那么有没有办法让它告诉我呢?我可以手动检查所有的代码,寻找声明,但是在这个系统中有成千上万的代码行。

z31licg0

z31licg01#

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

参见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
fafcakar

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

相关问题