我有一个程序有一些内部配置的文件名。该程序编辑一组与数据库帐户关联的配置文件,然后更改数据库帐户的数据库密码。配置文件列表通过内部列表与数据库帐户的名称关联。当我处理这些文件,我在我的节目以下循环:需要perl就地编辑不在命令行上的文件
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。我如何得到这个实际编辑的地方?将$^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的有用建议,如果这样做可能会这样。我正在编辑的配置文件永远不会超过几K字节,所以Tie不会使用太多的内存。
其实我不需要备份,因为这些文件存储在源代码控制系统中。此脚本的下一步是将SCCS(本例中为Perforce)集成到脚本中,以便在更新文件时检出并提交文件。 – Wexxor 2011-05-19 22:48:09