On Wed, Jun 15, 2005 at 08:41:08PM +0200, Claude Paroz wrote:
> Mais mon code n'est justement pas complet, car il ne contient pas la
> partie interactive qui s'arrête à chaque remplacement possible pour
> demander à l'utilisateur s'il souhaite effectuer le remplacement ou non.
> C'est là que je bloque...

Effectivement, les commandes de base ne prévoient pas cela.

De toutes les solutions possibles, la piste Perl me semble la meilleure
car le language intègre les regexps et est raisonnablement
multiplateforme.

my $regexp = 'string to change';
my $dest = 'dest string';

my $error_reason = 'unknown',
my $result = 0; # SUCCESS

my @files = get_file_list(); # à implémenter, p.ex. glob('*.xml');
foreach my $file_name (@files) {
   local(*FILE);
   if (open(FILE, '<', $file_name)) {
      my $something_changed = 0;

      my $tmp_file_name = $file_name . '.NEW';
      local(*FILE_OUT);
      if (open(FILE_OUT, '>', $tmp_file_name)) {
         my $count = 1;
         while (my $line = <FILE>) {
            chomp $line;
            if ($line =~ /$regexp/) {
               my $new_line = $line;
               $new_line ~= s/$regexp/$dest/; 

               print "\n";
               print "< ", $line, "\n";
               print "> ", $new_line, "\n";
               print "Effectuer le changement ?: ";
               my $answer = <STDIN>;
               if ($answer ~= /^[YyoO]/) {
                  $line = $new_line;
                  $something_changed = 1;
               }
            }
            print FILE_OUT $line, "\n";
            $count++;
         }

         if (!close(FILE_OUT)) {
            $error_reason = 'error close()ing OUT: ' . $!;
            $result = 1;
         }
      }
      else {
         $error_reason = 'error open()ing OUT: ' . $!;
         $result = 1;
      }

      if (!close(FILE)) {
         $error_reason = 'error close()ing: ' . $!;
         $result = 1;
      }

      if (($result == 0) && $something_changed) {
         # POSIX-compatible rename assumed (non necessarily atomic)
         if (!rename($tmp_file_name, $file_name)) {
            $error_reason = 'error rename()ing: ' . $!;
            $result = 1;
         }
      }
   }
   else {
      $error_reason = 'error open()ing ' . $file_name . ': ' . $!;
      $result = 1;
   }
}

# traitement $error_reason/$result

non testé.
_______________________________________________
gull mailing list
[email protected]
http://lists.alphanet.ch/mailman/listinfo/gull

Répondre à