内部で構成された多数のファイル名を持つプログラムがあります。このプログラムは、データベース アカウントに関連付けられた一連の構成ファイルを編集し、データベース アカウントのデータベース パスワードを変更します。
構成ファイルのリストは、内部リストを介してデータベース アカウントの名前に関連付けられています。これらのファイルを処理すると、プログラムに次のループが発生します。
BEGIN { $^I = '.oldPW'; } # Enable in-place editing
...
foreach (@{$Services{$request}{'files'}})
{
my $filename = $Services{$request}{'configDir'} . '/' . $_;
print "Processing ${filename}\n";
open CONFIGFILE, '+<', $filename or warn $!;
while (<CONFIGFILE>)
{
s/$oldPass/$newPass/;
print;
}
close CONFIGFILE;
}
問題は、変更された出力が CONFIGFILE ではなく STDOUT に書き込まれることです。これを実際にその場で編集するにはどうすればよいですか? $^I をループ内に移動しますか? CONFIGFILE を印刷しますか? 私は困惑しています。
>
更新: PerlMonksで探していたものを見つけました。ループ内でローカル ARGV を使用して、通常の Perl の方法でインプレース編集を行うことができます。上記のループは次のようになります。
foreach (@{$Services{$request}{'files'}})
{
my $filename = $Services{$request}{'configDir'} . '/' . $_;
print "Processing ${filename}\n";
{
local @ARGV = ( $filename);
while (<>)
{
s/$oldPass/$newPass/;
print;
}
}
}
最初に configDir を追加しなければ、リスト全体をローカルの @ARGV に放り込むこともできますが、これで十分効率的です。
に関する有益な提案をありがとうTie::File
。これをやり直せば、私はおそらくそのようになるでしょう。私が編集している構成ファイルの長さが数 KB を超えることはないので、Tie はメモリをあまり使用しません。