Если ваш файл ориентирован на строки или записи, вы можете легко вставить строки или изменить отдельные строки с помощью основного модуля Tie :: File Это позволит обрабатывать файл как массив и строку Perl иманипулирование массивом для изменения файла в памяти.С помощью этого метода вы можете безопасно работать с большими файлами, превышающими объем вашей оперативной памяти.
Вот пример:
use strict; use warnings;
use Tie::File;
#create the default .txt file:
open (my $out, '>', "nums.txt") or die $!;
while(<DATA>) { print $out "$_"; }
close $out or die $!;
tie my @data, 'Tie::File', "nums.txt" or die $!;
my $offset=5;
my $insert="INSERTED";
#insert in a string:
$data[0]=substr($data[0],0,$offset).$insert.substr($data[0],$offset)
if (length($data[0])>$offset);
#insert a new array element that becomes a new file line:
splice @data,$offset,0,join(':',split(//,$insert));
#insert vertically:
$data[$_]=substr($data[$_],0,$offset) .
substr(lc $insert,$_,1) .
substr($data[$_],$offset) for (0..length($insert));
untie @data; #close the file too...
__DATA__
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Вывод:
12345iINSERTED6789
23456n7891
34567s8912
45678e9123
56789r1234
I:N:St:E:R:T:E:D
67891e2345
78912d3456
891234567
912345678
Изменения файлов сTie::File
сделаны на месте и как массив модифицируется.Вы можете использовать Tie::File
только в первой строке вашего файла для изменения и вставки по вашему запросу.Вы можете поместить sleep
между модами массива и использовать tail -n +0 -f
для файла и наблюдать за изменением файла, если хотите ...
В качестве альтернативы, если ваш файл имеет разумный размер и вы хотите обращаться с ним каксимволов, вы можете прочитать весь файл в память, выполнить строковые операции с данными, а затем записать измененные данные обратно.Обратите внимание:
use strict; use warnings;
#creat the default .txt file:
open (my $out, '>', "nums.txt") or die $!;
while(<DATA>) { print $out "$_"; }
close $out or die $!;
my $data;
open (my $in, '<', "nums.txt") or die $!;
{ local $/=undef; $data=<$in>; }
close $in or die $!;
my $offset=5;
my $insert="INSERTED";
open (my $out, '>', "nums.txt") or die $!;
print $out substr($data,0,$offset).$insert.substr($data,$offset);
close $out or die $!;
__DATA__
123456789
2
3
4
5
6
7
8
9
Вывод:
12345INSERTED6789
2
3
4
5
6
7
8
9
Если вы рассматриваете файлы как символы, имейте в виду, что в Windows файлы в текстовом режиме имеют \r\n
для новой строки.Это два символа, если они открыты в двоичном режиме.