需要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;
}
问题是,这会将修改后的输出写入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;
}
}
}
如果不是一开始就添加configDir,我可以将整个列表扔到本地@ARGV中,但这足够有效。
感谢您对Tie::File
的有益建议。如果结束,我可能会那样做。我正在编辑的配置文件的长度从不超过几KB,因此Tie不会使用过多的内存。
没有找到相关结果
已邀请:
3 个回复
柑恫祟
和convenient5ѭ。您的代码的内部看起来像:
扇献隙
变量仅使用空的
构造对保存在held8ѭ中的文件名序列起作用。也许这样的事情会工作:
但是,如果这不是一个简单的脚本,并且您需要使用
和
进行其他用途,则最好使用
这样的命令来完成此任务:
茶鬼失形