我有一个内部配置了许多文件名的程序。该程序编辑一堆与数据库帐户关联的配置文件,然后更改数据库帐户的数据库密码。
配置文件列表通过内部列表与数据库帐户的名称相关联。当我处理这些文件时,我的程序中有以下循环:
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;
}
问题是,这会将修改后的输出写入 STDOUT,而不是 CONFIGFILE。我如何让它真正就地编辑?将 $^I 移动到循环内?打印配置文件?我难住了。
>
更新:我在 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 不会占用太多内存。