当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Perl的本地范围内访问导入模块中的变量?》经验,为你挑选了1个好方法。

创建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它,因为它是别人拥有/使用的,我可以使用它:(



1> zdim..:

导出变量很容易导致麻烦。

为什么不

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自己对此警告。

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有