Lire et modifier un fichier en perl
Résolu/Fermé
na_ba85
[Dal]
- Messages postés
- 8
- Date d'inscription
- mardi 18 juin 2013
- Statut
- Membre
- Dernière intervention
- 1 septembre 2017
[Dal]
- Messages postés
- 5894
- Date d'inscription
- mercredi 15 septembre 2004
- Statut
- Contributeur
- Dernière intervention
- 22 juillet 2022
A voir également:
- Lire et modifier un fichier en perl
- Lire et modifier un fichier en perl ✓ - Forum - Perl
- Lire un fichier avec perl ✓ - Forum - Perl
- Modifier extension fichier - Guide
- Impossible de lire à partir du fichier ou de la disquette source ✓ - Forum - Windows
- Modifier un fichier pdf - Guide
1 réponse
[Dal]
Modifié le 4 sept. 2017 à 13:05
- Messages postés
- 5894
- Date d'inscription
- mercredi 15 septembre 2004
- Statut
- Contributeur
- Dernière intervention
- 22 juillet 2022
Modifié le 4 sept. 2017 à 13:05
Salut Naba,
Il y a plusieurs problèmes :
- tout d'abord, je ne comprends pas bien ton code, et je pense qu'il n'est pas complet
- tu n'utilises pas le filehandle $fh pour des opérations d'écriture, seulement de lecture
- je ne pense pas que tu puisses modifier un fichier texte en l'ouvrant ainsi, sans risquer un écrasement de données
- ton code pour parser et localiser les informations à changer est compliqué et une simple regexp sur le contenu du fichier suffirait à faire ce qu'il faut
à mon sens, il faut :
- ouvrir le fichier en lecture et en aspirer la totalité dans une variable
- appliquer une regexp pour modifier ce qui doit l'être
- écrire le contenu dans un fichier intermédiaire
- effacer le fichier d'origine et renommer le fichier temporaire
Voilà un exemple dont tu peux t'inspirer, qui utilise File::Temp et File::Copy, qui sont des modules standard de Perl, et qui fonctionne sur l'exemple de format que tu donnes :
Le répertoire temporaire et le fichier temporaire seront supprimés automatiquement par Perl.
Dal
Il y a plusieurs problèmes :
- tout d'abord, je ne comprends pas bien ton code, et je pense qu'il n'est pas complet
- tu n'utilises pas le filehandle $fh pour des opérations d'écriture, seulement de lecture
- je ne pense pas que tu puisses modifier un fichier texte en l'ouvrant ainsi, sans risquer un écrasement de données
- ton code pour parser et localiser les informations à changer est compliqué et une simple regexp sur le contenu du fichier suffirait à faire ce qu'il faut
à mon sens, il faut :
- ouvrir le fichier en lecture et en aspirer la totalité dans une variable
- appliquer une regexp pour modifier ce qui doit l'être
- écrire le contenu dans un fichier intermédiaire
- effacer le fichier d'origine et renommer le fichier temporaire
Voilà un exemple dont tu peux t'inspirer, qui utilise File::Temp et File::Copy, qui sont des modules standard de Perl, et qui fonctionne sur l'exemple de format que tu donnes :
#!/usr/bin/perl use strict; use warnings; # simulate a value for $opt_mode my $opt_mode = "deactivate"; # load na_ba85.txt into a string my $string; { local $/ = undef; open my $fh, "<", "na_ba85.txt" or die "could not open file: $!"; $string = <$fh>; close $fh; } # use regexp to match the file in 3 parts my $beg; # beginning up to opening ' of matched word my $end; # rest from closing ' up to end if ($string =~ /(.*^NAME2\).*?word=')([^']+)(.*)/sm) { $beg = $1; $end = $3 } else { print "Error: no match, wrong file format\n"; exit; } # set $word according to value of $opt_mode my $word; if ($opt_mode eq "activate") { $word = "Yes"; } else { $word = "No"; } # save to a temp file and replace na_ba85.txt use File::Temp qw(tempdir); my $dir = tempdir( CLEANUP => 1 ); open my $fh, ">", "$dir/na_ba85.txt"; print $fh $beg . $word . $end; close $fh; use File::Copy; copy("$dir/na_ba85.txt", "na_ba85.txt") or die "Copy failed: $!";
Le répertoire temporaire et le fichier temporaire seront supprimés automatiquement par Perl.
Dal