Wenn Ihre Datei Zeile oder Datensatz ausgerichtet ist, können Sie Zeilen einfügen oder einzelne Linien leicht mit dem Kernmodul ändern Tie::File Dies wird die Datei als Array und Perl-String und Array-Manipulation behandelt werden, damit verwendet werden um die Datei im Speicher zu ändern. Mit dieser Methode können Sie mit großen Dateien arbeiten, die größer als Ihr RAM sind.Hier
ist ein Beispiel:
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
Output:
12345iINSERTED6789
23456n7891
34567s8912
45678e9123
56789r1234
I:N:St:E:R:T:E:D
67891e2345
78912d3456
891234567
912345678
Die Dateiänderungen mit Tie::File
werden an Ort und Stelle hergestellt und wie das Array modifiziert wird. Sie könnten Tie::File
nur in der ersten Zeile der Datei verwenden, um zu ändern und einzufügen, wie Sie angefordert haben. Sie können sleep
zwischen den Array-Mods setzen und tail -n +0 -f
auf die Datei verwenden und die Datei ändern sehen, wenn Sie es wünschen ...
Alternativ, wenn Sie Ihre Datei angemessene Größe ist und Sie wollen es wie Zeichen zu behandeln, können Sie das lesen gesamte Datei in den Speicher, führen Sie String-Operationen für die Daten aus und schreiben Sie die geänderten Daten dann wieder zurück. Bedenken Sie:
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
Ausgang:
12345INSERTED6789
2
3
4
5
6
7
8
9
Wenn Sie Dateien als Zeichen behandeln, hüte dich, dass unter Windows, Dateien im Textmodus ein \r\n
für eine neue Zeile haben. Das sind zwei Zeichen, wenn sie im Binärmodus geöffnet werden.
Haben Sie versucht, einen Modus zu verwenden, der nicht anfügt? wie zum Beispiel: open (meine $ fh, '<+', "try.txt") oder die $ !; (Dies ist auch eine "modernere" Verwendung von open(), siehe http://perldoc.perl.org/functions/open.html) –
@ Øyvind Skaar Es ist "" <"<" <"<" <" '. –
@chas richtig du bist .. –