Изменение
foreach my $f (@files){
if ($f =~ s/thisgoesout/thisgoesin/gi) {
#inplace file editing, or something like that
}
}
Для
foreach my $f (@files){
open my $in, '<', $f;
open my $out, '>', "$f.out";
while (my $line = <$in>){
chomp $line;
$line =~ s/thisgoesout/thisgoesin/gi
print $out "$line\n";
}
}
Предполагается, что шаблон не занимает несколько строк. Если шаблон может охватывать строки, вам нужно добавить содержимое файла. («slurp» - довольно распространенный термин в Perl).
Чип на самом деле не нужен, меня просто укусили строки, которые не были chomp
отредактированы один раз (если вы уроните chomp
, измените print $out "$line\n";
на print $out $line;
).
Аналогично, вы можете изменить open my $out, '>', "$f.out";
на open my $out, '>', undef;
, чтобы открыть временный файл, а затем скопировать этот файл поверх оригинала после завершения замены. На самом деле, и особенно, если вы выплескиваете весь файл, вы можете просто произвести подстановку в памяти, а затем записать поверх исходного файла. Но я сделал достаточно ошибок, делая то, что всегда записываю в новый файл и проверяю содержимое.
Примечание , у меня изначально был оператор if в этом коде. Это было, скорее всего, неправильно. Это скопировало бы только те строки, которые соответствовали регулярному выражению "thisgoesout" (заменив его, конечно, "thisgoesin"), в то же время молча поглощая остальные.