Si votre fichier est ligne ou un enregistrement orienté, vous pouvez insérer des lignes ou modifier des lignes individuelles facilement avec le module de base Tie::File Cela permettra au fichier à traiter comme un tableau et la chaîne Perl et la manipulation des tableaux à utiliser pour modifier le fichier en mémoire. Vous pouvez travailler en toute sécurité sur des fichiers volumineux plus volumineux que votre RAM avec cette méthode.
Voici un exemple:
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
Sortie:
12345iINSERTED6789
23456n7891
34567s8912
45678e9123
56789r1234
I:N:St:E:R:T:E:D
67891e2345
78912d3456
891234567
912345678
Les modifications de fichiers avec Tie::File
sont faits en place et que le tableau est modifié. Vous pouvez utiliser Tie::File
juste sur la première ligne de votre fichier pour modifier et insérer comme vous l'avez demandé. Vous pouvez mettre sleep
entre les mods de tableau et utiliser tail -n +0 -f
sur le fichier et regarder le fichier changer si vous le souhaitez ...
Alternativement, si votre fichier est de taille raisonnable et que vous voulez le traiter comme des caractères, vous pouvez lire le fichier entier en mémoire, effectuez des opérations de chaîne sur les données, puis réécrivez les données modifiées. Considérez:
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
Sortie:
12345INSERTED6789
2
3
4
5
6
7
8
9
Si vous traitez des fichiers comme des caractères, méfiez-vous que sous Windows, les fichiers en mode texte ont une \r\n
pour une nouvelle ligne. C'est deux caractères si elle est ouverte en mode binaire.
Avez-vous essayé d'utiliser un mode qui ne s'ajoute pas? tels que: open (my $ fh, '<+', "try.txt") ou die $ !; (c'est aussi une utilisation plus "moderne" de open(), voir http://perldoc.perl.org/functions/open.html) –
@ Øyvind Skaar C'est "" + <"" pas "<+" '. –
@chas droite vous êtes .. –