Si el archivo es la línea o registro orientado, puede insertar líneas o modificar las líneas individuales fácilmente con el módulo principal Tie::File Esto permitirá que el archivo sea tratado como una matriz y cadena de Perl y la manipulación de matrices para ser utilizado para modificar el archivo en la memoria. Puede operar con seguridad en archivos de gran tamaño más grandes que su RAM con este método.
Aquí es un ejemplo:
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
de salida:
12345iINSERTED6789
23456n7891
34567s8912
45678e9123
56789r1234
I:N:St:E:R:T:E:D
67891e2345
78912d3456
891234567
912345678
Las modificaciones de archivos con Tie::File
se hacen en su lugar y como se modifica la matriz. Puede usar Tie::File
solo en la primera línea de su archivo para modificar e insertar como lo solicitó. Puede poner sleep
entre los modos de matriz y usar tail -n +0 -f
en el archivo y ver el cambio de archivo si lo desea ...
Alternativamente, si su archivo es de un tamaño razonable y desea tratarlo como caracteres, puede leer todo el archivo en la memoria, realice operaciones de cadena en los datos, luego vuelva a escribir los datos modificados. Considere:
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
Salida:
12345INSERTED6789
2
3
4
5
6
7
8
9
Si usted trata a los archivos como caracteres, ten en cuenta que en Windows, los archivos en modo de texto tienen un \r\n
para una nueva línea. Eso es dos caracteres si se abre en modo binario.
¿Ha intentado utilizar un modo que no se agrega? tales como: open (my $ fh, '<+', "try.txt") o die $ !; (este es también un uso más "moderno" de open(), ver http://perldoc.perl.org/functions/open.html) –
@ Øyvind Skaar Es '" + <"' not '" <+ " '. –
@chas a la derecha eres ... –