Вот, пожалуйста,
local $^I = '.bak';
local @ARGV = ($filename);
local $_;
my $replaced = 0;
while (<>) {
if (!$replaced && /Begin_search_here/ .. $replaced) {
$replaced = s/Old/New/;
}
print;
}
Объяснение:
Установка переменной $^I
позволяет редактировать на месте, как если бы вы запускали perl с флагом -i
.Исходный файл будет сохранен с тем же именем, что и исходный файл, но с расширением «.bak»;замените ".bak"
на ""
, если вы не хотите, чтобы резервная копия была сделана.
@ARGV
установлен в список файлов для редактирования на месте;здесь только ваш единственный файл, названный в переменной $filename
.
$_
, локализован, чтобы предотвратить перезапись этой обычно используемой переменной в случае, если этот фрагмент кода встречается в подпрограмме.
Оператор триггера ..
используется, чтобы выяснить, в какой части файла выполнять подстановки. Он будет ложным до тех пор, пока не встретится первая строка, соответствующая шаблону Begin_search_here
, а затем останется истинным до первого разапроисходит замена (как записано в переменной $replaced
), когда она выключается.