Perl同一文件不同包内my变量声明为何触发作用域冲突警告?
为什么同一文件中不同Perl包的
my变量会出现作用域冲突? Perl里my声明的是词法变量,它的作用域由代码的花括号结构决定,和package声明的命名空间完全是两码事。package只是改变当前代码块的默认命名空间(比如子例程、全局变量的归属),但不会自动创建新的词法作用域。
你的代码里,两个my $instance都直接写在文件的顶级作用域(没有被花括号包裹),所以它们属于同一个词法作用域。第二个my $instance自然会被Perl检测到是同一作用域内的重复声明,从而抛出警告。
要解决这个问题,只需要给每个包的代码单独套上花括号,创建独立的词法作用域即可:
{ package Jabs::ConfigData; use strict; use warnings; my $instance; sub new { my ($class) = @_; unless (defined $instance) { $instance = bless {}, $class; } return $instance; } 1; # End of 'ConfigData' } { package Jabs::RuntimeData; use strict; use warnings; my $instance; sub new { my ($class) = @_; unless (defined $instance) { $instance = bless {}, $class; } return $instance; } 1; # End of 'RuntimeData' }
这样每个my $instance就处于各自独立的词法作用域中,既不会再触发警告,也能保证两个包的单例变量互不干扰。
内容的提问来源于stack exchange,提问作者autio
相关产品推荐
相关产品推荐

