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

有没有办法让Perl解释器在pl文件中列出所有全局变量?,perl,global-variables,Perl,Global Variables,我有一个巨大的系统,我正在从一个cgi转换成一个守护进程,我需要找到所有最终成为全局变量的变量(就像我的$…(not-declared with my$)) 它们的作用域可能是本地的,但在perl中,如果您不小心忘记了,这并不重要,但现在我会 我得弄清楚perl解释器可以分辨出区别,那么有没有办法让它告诉我呢?我可以手工查看所有代码,寻找声明,但是这个系统中有成千上万行代码。将显示所有未使用my声明的变量: $ perl -Mstrict=vars -c -e '$x=5; my $y=7; $

我有一个巨大的系统,我正在从一个cgi转换成一个守护进程,我需要找到所有最终成为全局变量的变量(就像我的$…(not-declared with my$)) 它们的作用域可能是本地的,但在perl中,如果您不小心忘记了,这并不重要,但现在我会

我得弄清楚perl解释器可以分辨出区别,那么有没有办法让它告诉我呢?我可以手工查看所有代码,寻找声明,但是这个系统中有成千上万行代码。

将显示所有未使用
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
这里有另一种使用

将显示未使用
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
这里有另一种使用


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

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

strict的有趣应用。:)@Brid foy,事实上,没有。OP想确保他没有忘记
my
,这就是为什么每个人都使用strict。他想消除“全局变量”,我想他指的是“包变量”。但是“严格使用”你看不到它们。如果您声明“我们的$foo”,那么“使用严格”不会抱怨任何事情,您仍然使用“包变量”。严格的有趣应用:@Brid foy,事实上,没有。OP想确保他没有忘记
my
,这就是为什么每个人都使用strict。他想消除“全局变量”,我想他指的是“包变量”。但是“严格使用”你看不到它们。如果您声明“我们的$foo”,那么“使用严格”不会抱怨任何事情,您仍然使用“包变量”。不要忘记使用警告!只需使用
严格使用。不要忘记使用警告