我有一个程序,内部配置了许多文件名.该程序编辑与数据库帐户关联的一组配置文件,然后更改数据库帐户的数据库密码.配置文件列表通过内部列表与数据库帐户的名称相关联.当我处理这些文件时,我的程序中有以下循环:
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;
}
Run Code Online (Sandbox Code Playgroud)
问题是,这会将修改后的输出写入STDOUT,而不是CONFIGFILE.如何让它实际编辑到位?在循环中移动$ ^ 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果不是在开始时修改configDir,我可以将整个列表扔到本地@ARGV,但这足够有效. …