Нужно Perl редактировать файлы не в командной строке

У меня есть программа, которая имеет несколько имен файлов, настроенных внутри. Программа редактирует несколько файлов конфигурации, связанных с учетной записью базы данных, а затем изменяет пароль базы данных для учетной записи базы данных.

Список файлов конфигурации связан с именем учетной записи базы данных через внутренний список. Когда я обрабатываю эти файлы, в моей программе появляется следующий цикл:

BEGIN { $^I = '.oldPW'; }  # Enable in-place editing
...
foreach (@{$Services{$request}{'files'}})
{
    my $filename = $Services{$request}{'configDir'} . '/' . 

У меня есть программа, которая имеет несколько имен файлов, настроенных внутри. Программа редактирует несколько файлов конфигурации, связанных с учетной записью базы данных, а затем изменяет пароль базы данных для учетной записи базы данных.

Список файлов конфигурации связан с именем учетной записи базы данных через внутренний список. Когда я обрабатываю эти файлы, в моей программе появляется следующий цикл:

[110]

Проблема в том, что записывает измененный вывод в STDOUT, а не в CONFIGFILE. Как мне получить это на самом деле редактировать на месте? Переместить $ ^ I внутри цикла? Печатать КОНФИФИЛЬ? Я в тупике.

>

Обновление: Я нашел то, что искал на PerlMonks . Вы можете использовать локальный ARGV внутри цикла для редактирования на месте обычным способом Perl. Вышеприведенный цикл теперь выглядит следующим образом:

foreach (@{$Services{$request}{'files'}})
{
    my $filename = $Services{$request}{'configDir'} . '/' . 

У меня есть программа, которая имеет несколько имен файлов, настроенных внутри. Программа редактирует несколько файлов конфигурации, связанных с учетной записью базы данных, а затем изменяет пароль базы данных для учетной записи базы данных.

Список файлов конфигурации связан с именем учетной записи базы данных через внутренний список. Когда я обрабатываю эти файлы, в моей программе появляется следующий цикл:

[110]

Проблема в том, что записывает измененный вывод в STDOUT, а не в CONFIGFILE. Как мне получить это на самом деле редактировать на месте? Переместить $ ^ I внутри цикла? Печатать КОНФИФИЛЬ? Я в тупике.

>

Обновление: Я нашел то, что искал на PerlMonks . Вы можете использовать локальный ARGV внутри цикла для редактирования на месте обычным способом Perl. Вышеприведенный цикл теперь выглядит следующим образом:

[111]

Если бы не было привязки configDir в начале, я мог бы просто выбросить весь список в локальный @ARGV, но это достаточно эффективно.

Спасибо за полезные советы по Tie::File. Я бы, наверное, пошел по этому пути, если бы закончил. Файлы конфигурации, которые я редактирую, никогда не превышают несколько килобайт, поэтому Tie не будет использовать слишком много памяти.

; print "Processing ${filename}\n"; { local @ARGV = ( $filename); while (<>) { s/$oldPass/$newPass/; print; } } }

Если бы не было привязки configDir в начале, я мог бы просто выбросить весь список в локальный @ARGV, но это достаточно эффективно.

Спасибо за полезные советы по Tie::File. Я бы, наверное, пошел по этому пути, если бы закончил. Файлы конфигурации, которые я редактирую, никогда не превышают несколько килобайт, поэтому Tie не будет использовать слишком много памяти.

; print "Processing ${filename}\n"; open CONFIGFILE, '+<', $filename or warn $!; while () { s/$oldPass/$newPass/; print; } close CONFIGFILE; }

Проблема в том, что записывает измененный вывод в STDOUT, а не в CONFIGFILE. Как мне получить это на самом деле редактировать на месте? Переместить $ ^ I внутри цикла? Печатать КОНФИФИЛЬ? Я в тупике.

>

Обновление: Я нашел то, что искал на PerlMonks . Вы можете использовать локальный ARGV внутри цикла для редактирования на месте обычным способом Perl. Вышеприведенный цикл теперь выглядит следующим образом:

foreach (@{$Services{$request}{'files'}})
{
    my $filename = $Services{$request}{'configDir'} . '/' . 

У меня есть программа, которая имеет несколько имен файлов, настроенных внутри. Программа редактирует несколько файлов конфигурации, связанных с учетной записью базы данных, а затем изменяет пароль базы данных для учетной записи базы данных.

Список файлов конфигурации связан с именем учетной записи базы данных через внутренний список. Когда я обрабатываю эти файлы, в моей программе появляется следующий цикл:

[110]

Проблема в том, что записывает измененный вывод в STDOUT, а не в CONFIGFILE. Как мне получить это на самом деле редактировать на месте? Переместить $ ^ I внутри цикла? Печатать КОНФИФИЛЬ? Я в тупике.

>

Обновление: Я нашел то, что искал на PerlMonks . Вы можете использовать локальный ARGV внутри цикла для редактирования на месте обычным способом Perl. Вышеприведенный цикл теперь выглядит следующим образом:

[111]

Если бы не было привязки configDir в начале, я мог бы просто выбросить весь список в локальный @ARGV, но это достаточно эффективно.

Спасибо за полезные советы по Tie::File. Я бы, наверное, пошел по этому пути, если бы закончил. Файлы конфигурации, которые я редактирую, никогда не превышают несколько килобайт, поэтому Tie не будет использовать слишком много памяти.

; print "Processing ${filename}\n"; { local @ARGV = ( $filename); while (<>) { s/$oldPass/$newPass/; print; } } }

Если бы не было привязки configDir в начале, я мог бы просто выбросить весь список в локальный @ARGV, но это достаточно эффективно.

Спасибо за полезные советы по Tie::File. Я бы, наверное, пошел по этому пути, если бы закончил. Файлы конфигурации, которые я редактирую, никогда не превышают несколько килобайт, поэтому Tie не будет использовать слишком много памяти.

16
задан Peter Mortensen 10 July 2019 в 21:26
поделиться