Perl子程序局部全局问题

Perl subroutine local global issue

对于这个小代码,它总是在全局代码块中打印@x 的值。如果我不小心没有在没有 'my @x' 的子例程中初始化变量,如何发出警告?我不想在子例程中将局部变量作为 @x.

use strict;
use warnings;
my @x=qw/1 2 3/;

&mysub();

sub mysub{

    print "@x";
}

用普通的 Perl 是做不到的。解决方案是不要在较小的范围内重复使用相同的变量名称


如果您想以编程方式强制执行此操作,可以使用 Perl::Critic. The policy Perl::Critic::Policy::Variables::ProhibitReusedNames 告诉您是否重复使用了已在外部作用域中定义的变量名。

  1. 更好地组织代码。

    use strict;
    use warnings;
    
    sub mysub{
        print "@x";
    }
    
    {
        my @x=qw/1 2 3/;
        mysub();
    }
    

    通过适当地本地化变量,不小心引用错误变量的情况不会改变。

  2. 不要使用这种无意义的变量名。

    偶然访问@frobs_by_name的可能性很小。