【问题标题】:declaring a hash table in one file and using it in another in Perl在一个文件中声明一个哈希表并在 Perl 中的另一个文件中使用它
【发布时间】:2011-05-22 22:39:04
【问题描述】:

我需要在一个文件中创建一个哈希表并在另一个文件中使用。原因是该表是我的“数据库”并且将被更改,并且我希望它与所有其他数据文件一起坐下,而不是与脚本文件一起坐下。

如何在我的脚本中使用表格?

【问题讨论】:

  • 所以你的哈希表在另一个 Perl 脚本中?
  • @Zaid,是的,有点。它不是一个脚本,而是一个专门用于声明哈希表的文件。

标签: perl hash


【解决方案1】:

在全局变量或包变量中定义您的哈希表。然后使用do 命令将定义加载到另一个脚本中:

 datafiles/database.def
 ---------------------------
 package ProjectData;
 our %DATA = ('abc' => 'def', 'ghi' => 'jkl', ...);


 scripts/myscript.pl
 ------------------------
 use strict;
 do 'datafiles/database.def';
 ... do something with %ProjectData::DATA ...

【讨论】:

  • 我会想到userequire,但我猜do 如果你想要特定的文件路径可以工作。
  • require 也是一个不错的选择,具体取决于您的错误检查需求。出错时(例如,文件名不正确),require 将“引发异常”,而 do 将返回 undef 并继续。如果你使用require,你还必须记住让你的文件返回一个“真”值。
  • do 在那里不合适。 do 用于不使用 package 时。 require(通常通过use)适用于您使用package(应该一直如此)。
  • 请注意,像这样在运行时加载不仅奇怪,还会导致“仅使用一次”警告。
  • 我看到您在节点中重新插入了错误。 切勿将do 与带有包的文件一起使用。
【解决方案2】:

方法太多了!

一个简单的方法是将您的数据以CSV 的形式写入文件,然后使用 Text::CSV 或 Text::CSV_XS 加载它。

更新

您还可以使用 do 内置函数从另一个脚本读取和执行 perl 文件。即:

do "config.pl";

或者使用允许复杂数据结构(XML、JSON、yaml、.ini 等)的配置文件格式。

【讨论】:

  • 这不是我要找的。我不想制作一个文本文件并让他们解析它,这就是我现在所做的,随着数据的增长它变得越来越复杂,而且我现在没有所有的数据,我希望能够在不更改脚本代码的情况下添加键和值(它是散列的散列)。
【解决方案3】:

也许您正在寻找tied hash

【讨论】:

    【解决方案4】:

    这可能不是最好的解决方案,但您可以只使用 StorableData::Dumper,它们都是自永远以来的核心(分别为 5.7.3 和 5.5)。

    或者,您可以将它们放在另一个模块中并使用/要求它,ala

    package MyImportantHash;
    

    use Exporter;

    our @EXPORT = qw( %important_hash );
    
    our %important_hash = (
                  some_key  => 'some_value',
             );
    
    1;
    

    在你的主包中,

    use MyImportantHash;
    say "$_ => $important_hash{$_}" for sort keys %important_hash;
    

    当然,这一切都假设您不希望在内存中的哈希值更改自动显示在文件中。如果你这样做了,看看 davorg 的回答就知道了。

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2012-06-16
      • 1970-01-01
      相关资源
      最近更新 更多