我有一個程序有一些內部配置的文件名。該程序編輯一組與數據庫帳戶關聯的配置文件,然後更改數據庫帳戶的數據庫密碼。配置文件列表通過內部列表與數據庫帳戶的名稱關聯。當我處理這些文件,我在我的節目以下循環:需要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