创建Perl Moose模块时遇到问题。
我有一个全局pm模块。
package XYZ; require Exporter; our @ISA = qw(Exporter); ## EDIT missed this line our @EXPORT_OK = qw($VAR); my $VAR1 = 1; our $VAR = {'XYZ' => $VAR1}; 1;
我想进入正在创建$VAR
的Moose
模块
package THIS; use Moose; use YAML::XS; sub get_all_blocks{ my ($self) = @_; require $self->get_pkg(); # this returns the full path+name of the above package # i cannot use use lib+use since the get_pkg starts complaining our $VAR; print YAML::XS::Dump($XYZ::VAR); # this works print YAML::XS::Dump($VAR); # this does not work # i cannot use the scope resolution since XYZ would keep changing. } 1;
有人可以帮我访问变量吗?
编辑:缺少package XYZ
代码中的一行。我不能触摸package XYZ
它,因为它是别人拥有/使用的,我可以使用它:(
导出变量很容易导致麻烦。
为什么不
package XYZ; use strict; use warnings; use Exporter qw(import); our @EXPORT_OK = qw(get_var); our $VAR = '...'; sub get_var { return $VAR }
然后
package THIS; use warnings; use strict; use XYZ qw(get_var); my $var = get_var();
见出口商。
至于你想做什么,有两个问题
$VAR
从XYZ
永远不会导入THIS
。如果需要其他软件包中的符号,则需要导入它们。这些软件包必须首先使它们可用,因此您也需要添加它们@EXPORT_OK
。因此,请使用上面的,$VAR
而不是get_var()
。
另一种方法是使用@EXPORT
,然后将这些符号引入每个说的程序中use Package;
。我强烈建议仅@EXPORT_OK
在呼叫者需要明确列出他们想要的内容时使用。这也很好地记录了正在使用的内容。
即使添加了该变量,也仍然存在一个具有相同名称的变量,该变量THIS
隐藏(蒙版,阴影)$XYZ::VAR
。因此,除去our $VAR
在THIS
。这是关于全局变量的一个很好的例子。一旦介绍了它们,就必须始终对它们小心。
但是,跨模块共享变量存在更大的问题。
它使应用程序组件纠缠在一起,使代码变得越来越难使用。它与定义范围和模块化设计的原则背道而驰,可以远距离执行操作,等等。Perl提供了许多很好的工具来构造代码,并且我们很少需要全局变量和共享变量。告诉Exporter
自己对此警告。
当然,这可能需要或很好地使用,有时可以在模块中找到它。但是,这是一个例外,请谨慎使用并谨慎使用。