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.
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.
Sua edição parece bem simples. Você já considerou simplesmente usar o sed com a opção -i?
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;
use File :: Inplace
Além disso, ele faz commit / rollback depois que você tem todas as alterações no local para um arquivo ...