【问题标题】:Import Data from Module从模块导入数据
【发布时间】:2015-03-22 15:53:21
【问题描述】:

我已经给出了一个文件 testconf.pm ,里面除了

my $item = {

'default'   =>     {

    'General'       =>    { 'item1' => 'config1',
                            'item2' => 'config2'
                          }
                   }
           };

在第二个文件 main.pl 中,我想为接下来的处理步骤加载哈希, 我尝试了一些类似的东西

use testconfig;
use Data::Dumper;
my $config;
$config = testconfig::item;
print Dumper $config;

但我无法使用来自 testconf 的数据。不幸的是,我无法使用导出器或 packagedeclaration 扩展 testconf.pm,使用我们的我的 instea 等等,因为这个文件必须保持这样。我如何从 main.pl 中的项目中获取值(顺便说一句。我需要访问数据,而不仅仅是转储它)

【问题讨论】:

  • 错字,已经更正了。谢谢
  • “不幸的是,我无法使用我们的 instea of​​ my 等使用导出器或包声明来扩展 testconf.pm,因为这个文件必须保持这样。”您正在进行什么样的项目,这会阻止您解决此类基本架构问题?
  • 基本上,其他人构建了一个巨大的程序,这是该程序的配置文件,而我只是一个必须使用此文件并且无法更改它以不杀死旧的巨大程序的小人程序
  • 我的建议:在积压工作上贴一张票来解决这个怪物,然后开始寻找更好的工作:-)
  • 好吧,因为我的工作中其他一切都很好,我想我可以忍受;)

标签: perl perl-module


【解决方案1】:

您明确告诉 Perl 将变量的范围(在哪里看到)限制在文件中,所以您不能这样做。

如果这是整个文件,您可以依靠这样一个事实,即通过更改对$item 的赋值是文件的最后一条语句

do("testconf.pm")
   or die($@ || $!);

my $item = do("testconf.pm")
   or die($@ || $!);

【讨论】:

  • 好吧,不是我指定的。这个文件是给我的,不知怎的,他们也读了。但我不知道怎么做。
  • PS - 给不是 Perl 模块的文件提供 .pm 扩展名是不合适的
  • 好吧,我不完全确定该给谁一个正确的答案标记,因为你们都给予了很大的支持。 Ben Grimm 关于解除引用和第一帮助,你以一种更优雅的方式。那么该给谁打分呢? (好吧,ikegami,我知道你的意思......但是代码的这一面不在我手中,所以我必须接受给定的东西)
  • 有不止一种方法可以做到这一点,但这个答案是正确的。
  • 因此,在您接受 Ben 的情况下,我将此标记为答案。但我也很感谢你!
【解决方案2】:

如果文件的结构不允许do 工作,您可以读取文件,进行任何必要的更改并eval

open my $fh, '<', 'testconfig.pm';
$/ = undef;
my $testconfig = <$fh>;
# changes to the $testconfig source go here
my $config = eval $testconfig;

【讨论】:

  • 不是说这是有道理的,但 OP 确实说“我无法使用导出器或包声明扩展 testconf.pm,使用我们的 instea 等等开,因为这个文件必须保持这种状态。”
  • 正如我所说,我无法更改 testconfig.pm 中的任何内容。 THisSuitIsBlackNOt,是的,我知道如果我可以改变任何东西,它会更容易,但我必须以某种方式接受这个文件。本,这是我的错字,更正了逗号
  • 好吧,这让我更近了一步,但我必须将它用作哈希。有了你的 hack,我不能将它用作哈希
  • 它作为文件中的 hashref 读入,您可以简单地将其取消引用为 %$config - 或直接例如$config->{默认}
  • 您的代码确实是一个 hack,因为它是 do 的重新实现。除此之外,这不是 hack,因为他应该使用 do 而不是 use/require 反正!
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2010-10-17
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多