Как вставить строку в начало файла с помощью Perl's Tie :: File? - PullRequest
2 голосов
/ 22 мая 2010

Я пытаюсь вставить / добавить строку 'COMMENT DUMMY' в начале файла в качестве первой строки, если / PATTERN / не найден. Я знаю, как это сделать с помощью функции ОТКРЫТЬ ЗАКРЫТЬ. Вероятно, после прочтения файла он должен выглядеть примерно так:

open F, ">", $fn or die "could not open file: $!"; ;
     print F "COMMENT DUMMY\n", @array;
close F;

Но мне нужно реализовать это с использованием функции Tie :: File, и я не знаю, как.

use strict; 
use warnings; 
use Tie::File;


my $fn = 'test.txt';
tie my @lines, 'Tie::File', $fn or die "could not tie file: $!";

untie @lines; 

Ответы [ 3 ]

2 голосов
/ 22 мая 2010

unshift работ:

use Tie::File;
my $fn = 'test.txt';
tie my @lines, 'Tie::File', $fn or die "could not tie file: $!";
unshift @lines, "COMMENT DUMMY\n";
untie @lines;
1 голос
/ 22 мая 2010

Смысл связи - заставить одну вещь вести себя как другая.Поскольку вы привязываете файл к массиву, он теперь действует как массив.Вы используете операторы массива, чтобы делать все, что вам нужно.

1 голос
/ 22 мая 2010

Кинопико указал вам в правильном направлении. Чтобы удовлетворить ваши потребности, я бы сделал следующее:

use strict;
use warnings;
use Tie::File;

my $fileName = 'test.txt';

tie my @lines, 'Tie::File', $fileName or die "Unable to tie $fileName: $!";

unshift @lines, "DUMMY COMMENT\n" if grep { /PATTERN/ } @lines;

untie @lines;

Объяснение

  • Возможно, вы уже знаете, что, хотя оператор if следует после письменного оператора unshift, он оценивается первым.
  • Когда вы видите grep, думайте об этом как о фильтре списка. По сути, он берет ваш список @lines и использует его для создания нового списка только с элементами, которые соответствуют /PATTERN/.
  • Оператор if оценивается как true, если новый отфильтрованный список содержит какие-либо элементы, и false, если список пуст. Исходя из этого, строка "DUMMY COMMENT\n" добавляется в список @lines.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...