我需要就地编辑文件之内一个 perl 脚本,因此经常使用一行代码:
perl -p -e s/<value>/<value>/ig
对于这种情况不起作用。如何从 perl 脚本中获得相同的结果?
open(CRONTAB, "+<file" || die "...";
while (<CRONTAB>) {
if ($_ =~ /value/) {
s/^\#+//;
print "$_\n";
}
}
我的打印结果正是我想要的。这正是我所寻找的就地编辑。
答案1
do {
local $^I='.bak'; # see perlvar(1)
local @ARGV=("file");
while(<>){
s/<value>/<value>/ig;
print;
}
};
但要小心:$^I
像 perl 这样的语言-i
并不是防崩溃的。
答案2
您的编辑看起来非常简单。您是否考虑过简单地使用sed使用 -i 选项?
答案3
-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;
答案4
使用文件::就地
此外,在您对文件进行所有更改后,它还可以提交/回滚......