これは良い設計上の選択ではありません。
- Perl モジュールは、ユーザーが読み込めるが書き込めないようにインストールすることができます (すべきです!)。
- モジュールが複数のユーザーまたは複数の Perl プログラムによって使用される場合、conf はアプリケーション固有ではなく、システム グローバルになります。
- プログラムの複数のインスタンスが同時に実行されると、問題が発生します。
JSON、Freeze/Thaw、Dumper は他の候補かもしれませんが、YAML のようなデータ シリアル化形式を使用することをお勧めします。この構成は、別のファイルに保存することをお勧めします。
データを同じファイルに保存する必要がある場合は、トークンを使用できます__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 ...;