这不是一个好的设计选择。
- Perl 模块可以(应该!)以用户可以阅读但不能编写的方式安装。
- 如果该模块被多个用户或多个 Perl 程序使用,则 conf 将是系统全局的,而不是特定于应用程序的。
- 如果同时运行程序的多个实例,则会出现问题。
我建议使用像 YAML 这样的数据序列化格式,尽管 JSON、Freeze/Thaw 和 Dumper 可能是其他参赛者。此配置最好存储在单独的文件中。
如果您必须将数据存储在同一个文件中,则可以使用__DATA__
令牌。后面的所有内容都可以在代码中作为DATA
文件句柄访问,并且不会由 perl 执行。在更新配置时找到这个令牌也很简单。如果模块被调用Foo::Bar
:
my $serialized_stuff = ...;
my $self_loc = $INC{"Foo/Bar.pm"}; # %INC holds the location for every loaded module.
my $tempfile = ...;
open $SELF, "<", $self_loc or die ...;
open $TEMP, ">", $tempfile or die ...;
# don't touch anything before __DATA__
while(<$SELF>) {
print $TEMP $_;
last if /^__DATA__$/;
}
print $TEMP $serialized_stuff;
close $TEMP; close $SELF;
rename $tempfile => $self_loc or die ...;