Расти в perl. Как прочитать файл данных, а затем заменить всю строку в этом файле, если найдена указанная строка c - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужна быстрая perl помощь. Вот что я хочу сделать так:

1) запустить мой скрипт perl из командной строки и передать в качестве аргумента файл данных. 2) Найти переданный файл данных и найти первый. вхождение слова в строку. Замените всю строку, в которой находится строка, другой строкой текста. 3) Сохраните обновленный файл в себе (замените его внутри файла).

Так, например, что-то вроде этого:

./myPerlScript.pl data.txt

с файлом данных, который выглядит примерно так:

_DATA__
path/to/some/file
path/to/some/other/file
path/to/SUBTSTRING/file #replace entire line if SUBSTRING is found
path/to/file

, но фактический data.txt обновляется (НЕ записывается в новый файл)

1 Ответ

3 голосов
/ 23 апреля 2020

То же, что и на любом другом языке.

use Fcntl qw( SEEK_SET );

my $qfn = $ARGV[0];
open(my $fh, '+<', $qfn)
   or die("Can't open \"$qfn\": $!\n");

# Read contents of file into $file.    
my $file; { local $/; $file = <$fh>; }

if ($file =~ s/^.*SUBSTR.*/foo/mg) {
   seek($fh, 0, SEEK_SET)
      or die("seek: $!\n");
   truncate($fh, 0)
      or die("truncate: $!\n");
   print($fh $file)
      or die("print: $!\n");
   close($fh)
      or die("close: $!\n");
}

Другой способ:

  1. Создать временный файл в том же каталоге, что и исходный файл.
  2. Чтение из файла и запись измененного содержимого в новый файл.
  3. При возникновении ошибки удалите временную.
  4. Удалите оригинал.
  5. Переименуйте временный.

Это то, что происходит, когда вы делаете следующее при использовании достаточно свежей версии Perl:

perl -nle'print /SUBSTR/ ? "foo" : $_' -i file

Мы можем получить доступ к этой функции через $^I

$^I = '';
while (<>) {
   chomp;
   say /SUBSTR/ ? "foo" : $_;
}

У этого подхода есть два преимущества:

  • Нет потери данных при ошибке.
  • Это позволяет нам читать файл построчно (таким образом, экономя память) .

И три недостатка:

  • Требуется достаточно места на диске как для исходного, так и для измененного файла.
  • Требуется разрешение на создание нового файла.
  • Файл теряет все права и полномочия, которые у него были изначально.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...