【发布时间】:2011-05-22 22:39:04
【问题描述】:
我需要在一个文件中创建一个哈希表并在另一个文件中使用。原因是该表是我的“数据库”并且将被更改,并且我希望它与所有其他数据文件一起坐下,而不是与脚本文件一起坐下。
如何在我的脚本中使用表格?
【问题讨论】:
-
所以你的哈希表在另一个 Perl 脚本中?
-
@Zaid,是的,有点。它不是一个脚本,而是一个专门用于声明哈希表的文件。
我需要在一个文件中创建一个哈希表并在另一个文件中使用。原因是该表是我的“数据库”并且将被更改,并且我希望它与所有其他数据文件一起坐下,而不是与脚本文件一起坐下。
如何在我的脚本中使用表格?
【问题讨论】:
在全局变量或包变量中定义您的哈希表。然后使用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 ...
【讨论】:
use 或require,但我猜do 如果你想要特定的文件路径可以工作。
require 也是一个不错的选择,具体取决于您的错误检查需求。出错时(例如,文件名不正确),require 将“引发异常”,而 do 将返回 undef 并继续。如果你使用require,你还必须记住让你的文件返回一个“真”值。
do 在那里不合适。 do 用于不使用 package 时。 require(通常通过use)适用于您使用package(应该一直如此)。
do 与带有包的文件一起使用。
方法太多了!
一个简单的方法是将您的数据以CSV 的形式写入文件,然后使用 Text::CSV 或 Text::CSV_XS 加载它。
更新:
您还可以使用 do 内置函数从另一个脚本读取和执行 perl 文件。即:
do "config.pl";
或者使用允许复杂数据结构(XML、JSON、yaml、.ini 等)的配置文件格式。
【讨论】:
也许您正在寻找tied hash。
【讨论】:
这可能不是最好的解决方案,但您可以只使用 Storable 或 Data::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 的回答就知道了。
【讨论】: