Назад | Перейти на главную страницу

Редактирование Perl на месте в скрипте

Мне нужно отредактировать файл на месте в пределах сценарий perl, поэтому часто использовался один лайнер:

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

не сработает в этой ситуации. Как мне получить такие же результаты из сценария Perl?

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

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

Моя печать показывает именно то, что я хочу. Я ищу просто редактирование на месте.

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

Однако будьте осторожны: $^I как у Perl -i не защищен от сбоев.

Ваше редактирование кажется довольно простым. Вы рассматривали возможность просто использовать sed с параметром -i?

Попробуйте это, основываясь на переводе -i в 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;

использовать File :: Inplace

Кроме того, у него есть фиксация / откат после того, как вы внесете все свои изменения в файл ....