У меня есть программа, которая имеет несколько имен файлов, настроенных внутри.Программа редактирует набор файлов конфигурации, связанных с учетной записью базы данных, а затем изменяет пароль базы данных для учетной записи базы данных.
Список файлов конфигурации связан с именем учетной записи базы данных через внутренний список.Когда я обрабатываю эти файлы, в моей программе появляется следующий цикл:
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
.Я бы, наверное, пошел по этому пути, если бы закончил.Файлы конфигурации, которые я редактирую, никогда не превышают нескольких килобайт, поэтому Tie не будет использовать слишком много памяти.