如何在Perl的本地范围内访问导入模块中的变量?

Justrajdeep

创建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;

我想进入正在创建$VARMoose模块

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();

出口商

至于你想做什么,有两个问题

  • $VARXYZ永远不会导入THIS如果需要其他软件包中的符号,则需要导入它们。这些软件包必须首先使它们可用,因此您也需要添加它们@EXPORT_OK因此,请使用上面的,$VAR而不是get_var()

    另一种方法是使用@EXPORT,然后将这些符号引入每个说的程序中use Package;我强烈建议仅@EXPORT_OK在呼叫者需要明确列出他们想要的内容时使用。这也很好地记录了正在使用的内容。

  • 即使添加了该变量,也仍然存在一个具有相同名称的变量,该变量THIS隐藏(蒙版,阴影)$XYZ::VAR因此,除去our $VARTHIS这是有关全局变量的一个很好的例子。介绍它们后,您必须始终对它们保持谨慎。

但是,跨模块共享变量存在更大的问题。

它使应用程序组件纠缠在一起,使代码变得越来越难使用。它与定义范围和模块化设计的原则背道而驰,可以远距离执行操作,等等。Perl提供了许多很好的工具来构造代码,并且我们很少需要全局变量和共享变量。告诉Exporter自己对此警告

当然,这可能需要或很好地使用,有时可以在模块中找到它。但是,这是个例外,请谨慎使用并谨慎使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在函数中引用模块变量而不在Elixir 1.0.3中引用其模块?在其父范围内?

如何访问在 perl 模块中导入的变量?

如何在范围内的Golang模板中显示变量

如何在python中的给定范围内循环变量

在 Python 中导入模块是否会在本地范围内执行模块的所有导入?

如何在类范围之外但在父类范围内访问变量?

Julia:模块范围内的本地

在模板中,如何在“ with”或“ range”范围内访问外部范围?

Python:如何在函数的本地范围内运行eval()

如何访问__main__范围内的全局变量?

如何在项目范围内扩充模块?

如何在eval()范围内访问javascript函数

如何在根范围内访问解决日期

Google云功能:如何在所需范围内的云功能中获取访问令牌?

如何在Oracle RPD中的给定主题范围内限制对特定演示文稿表的访问?

如何在范围内写入变量数

如何在范围内保持awk变量?

如何在JavaScript中连续检测变量是否在范围内超过2秒

在类范围内声明时,如何在C ++ 14中引用变量模板?

如何在未来的范围内使用jQuery中的php变量值

如何在Java中修复“类型参数S不在类型变量E的范围内”

如何在变量中对日期范围内的每一行求和

在Python中定义函数后,如何在函数范围内更改变量?

如何导出在全局范围内可用于ES6导入的模块

在SQL中,如何在范围内进行“分组依据”?

如何在golang中的嵌套结构范围内?

如何在Golang中未知类型的通道范围内

如何在Python中给定范围内的单词宽行?

如何在移动范围内总结列表中的元素