Perl in place edit dentro de um script

2

Eu preciso editar um arquivo no lugar dentro de um script perl, então o oft usou um forro:

perl -p -e s/<value>/<value>/ig 

não funcionará para esta situação. Como faço para obter os mesmos resultados dentro de um script perl?

open(CRONTAB, "+<file" || die "...";

while (<CRONTAB>) { 
   if ($_ =~ /value/) {  
      s/^\#+//;  
      print "$_\n";  
   }  
}

Minha impressão está mostrando exatamente o que eu quero. É apenas a edição que estou procurando.

    
por Shawn Anderson 04.09.2009 / 21:14

4 respostas

5
do {
  local $^I='.bak'; # see perlvar(1)
  local @ARGV=("file");
  while(<>){
    s/<value>/<value>/ig;
    print;
  }
};

Tenha cuidado, porém: $^I como -i do perl não é resistente a falhas.

    
por 04.09.2009 / 22:42
0

Sua edição parece bem simples. Você já considerou simplesmente usar o sed com a opção -i?

    
por 04.09.2009 / 21:32
0

Tente isso, com base na tradução de -i em perldoc perlrun :

use strict;
use warnings;
my $filename = "something";
my $extension = '.orig';
while (<>) {
    my $backup;
    if ($extension !~ /\*/) {
        $backup = $filename . $extension;
    }
    else {
        ($backup = $extension) =~ s/\*/$filename/g;
    }
    rename $filename, $backup;
    open my $outfile, '>', $filename;
    select $outfile;
    s/^\#+// if /value/; 
}
continue {
    print;  # this prints to original filename
}
select STDOUT;
    
por 01.10.2009 / 05:16
0

use File :: Inplace

Além disso, ele faz commit / rollback depois que você tem todas as alterações no local para um arquivo ...

    
por 18.02.2010 / 08:07

Tags