将运行时所需的数据文件与 Perl 模块捆绑在一起的“正确”方法是什么,以便模块可以在使用之前读取其内容?
一个简单的例子是这个 Dictionary 模块,它需要在启动时读取 (word,definition) 对的列表。
package Reference::Dictionary;
# TODO: This is the Dictionary, which needs to be populated from
# data-file BEFORE calling Lookup!
our %Dictionary;
sub new {
my $class = shift;
return bless {}, $class;
}
sub Lookup {
my ($self,$word) = @_;
return $Dictionary{$word};
}
1;
和一个驱动程序 Main.pl:
use Reference::Dictionary;
my $dictionary = new Reference::Dictionary;
print $dictionary->Lookup("aardvark");
现在,我的目录结构如下所示:
root/
Main.pl
Reference/
Dictionary.pm
Dictionary.txt
我似乎无法让 Dictionary.pm 在启动时加载 Dictionary.txt。我已经尝试了一些方法来让它工作,比如......
使用 BEGIN 块:
BEGIN { open(FP, '<', 'Dictionary.txt') or die "Can't open: $!\n"; while (<FP>) { chomp; my ($word, $def) = split(/,/); $Dictionary{$word} = $def; } close(FP); }
没有骰子:Perl 在 cwd 中查找 Dictionary.txt,它是主脚本(“Main.pl”)的路径,而不是模块的路径,所以这给出了 File Not Found。
使用数据:
BEGIN { while (<DATA>) { chomp; my ($word, $def) = split(/,/); $Dictionary{$word} = $def; } close(DATA); }
并在模块结束时
__DATA__ aardvark,an animal which is definitely not an anteater abacus,an oldschool calculator ...
这也失败了,因为 BEGIN 在编译时执行,在DATA可用之前。
硬编码模块中的数据
our %Dictionary = ( aardvark => 'an animal which is definitely not an anteater', abacus => 'an oldschool calculator' ... );
有效,但绝对不可维护。
这里有类似的问题:我应该如何使用 Perl 模块分发数据文件?但是那个处理由 CPAN 安装的模块,而不是我试图做的与当前脚本相关的模块。