найдите di git в $ _ и добавьте данные в $ _ в perl - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь прочитать данные из файла с помощью файлового ввода-вывода в perl. Я хочу найти целое число, сравнить его и добавить в строку целое число. Мой файл состоит из такой строки.

файл mfile.txt start_value 0 end_value 13000 ошибок 30

Я хочу сравнить end_value и хочу добавить 500 или 2000 после это end_value.

файл mfile.txt start_value 0 end_value 13000 2000 ошибок 30

Это редактирование должно выполняться в том же файле. Мой код выглядит следующим образом.

print "Enter file ";
$file= <STDIN>;
chomp ($file);

open ( DATA, "+<$file") || die "No file";

while(<DATA>) {
   print "$_\n";    
   @line = split / /, $_; 
   print "$line[5]";
   $epat = $line[5];
   if ($epat > 10000) {
       $line[6] = "2000 errors";
   }
   else {
       $line[6] = "500 errors";
   }
   $_ = join (" ", @line);
   print "$_";
   print "\n";
}

close DATA

Я попытался преобразовать $ _ в массив и найти end_value, вызвав его индекс и сравнив его. Все работало нормально, но как записать это новое изменение в ту же строку того же файла? После этого файл не изменяется. Как это сделать?

1 Ответ

2 голосов
/ 18 июня 2020

Вы можете использовать perl -i, чтобы изменить файл на месте, но затем вам нужно заполнить @ARGV именем файла. В любом случае он записывает в другой файл и переименовывает его обратно за кулисами.

Фактически, вы можете использовать только однострочник:

perl -i~ -ape 's/(?=errors)/$F[5] > 10000 ? "2000 " : "500 "/e' -- filename
  • -i~ создает резервное копирование файла с использованием суффикса ~
  • -a разбивает каждую строку на массив @F
  • -p считывает входные файлы или файлы аргументов построчно и печатает каждую строку после обработки
  • s///e выполняет замену, но интерпретирует замену как код для запуска.
  • (?=errors) - это предварительное утверждение, оно соответствует месту начала "ошибок", но не заменить совпадающую часть
  • ? : - тернарный оператор, он соответствует if then else на уровне выражения
...