Подтвердить что ты не робот

Как заменить строку в существующем файле в Perl?

Я хочу заменить слово "синий" на "красный" во всех текстовых файлах с именем 1_classification.dat, 2_classification.dat и т.д. Я хочу отредактировать тот же файл, поэтому я пробовал этот код, но он не работает. Где я иду не так?

@files=glob("*_classification.dat");
foreach my $file (@files)
{
    open(IN,$file) or die $!;
    <IN>;
    while(<IN>)
    {
       $_='~s/blue/red/g';
       print IN $file;
    }

   close(IN)
}
4b9b3361

Ответ 1

Что-то не так с одним слоем?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat

Объяснение

  • -p обрабатывает, затем печатает <> строка за строкой
  • -i активирует редактирование на месте. Файлы резервируются с помощью расширения .bak
  • Замена регулярных выражений действует на неявную переменную, которая является содержимым файла, строка за строкой

Ответ 2

$_='~s/blue/red/g';

Ух, что??

Просто

s/blue/red/g;

или, если вы настаиваете на использовании переменной (которая не нужна при использовании $_, но я просто хочу показать правильный синтаксис):

$_ =~ s/blue/red/g;

Ответ 3

Ни один из существующих ответов здесь не дает полного примера того, как это сделать из script (а не с одним слоем). Вот что я сделал:

rename($file, $file.'.bak');
open(IN, '<'.$file.'.bak') or die $!;
open(OUT, '>'.$file) or die $!;
while(<IN>)
{
    $_ =~ s/blue/red/g;
    print OUT $_;
}
close(IN);
close(OUT);