我知道你可以在命令中运行这样的命令
perl -p -i -e 's/oldtext/newttext/g' file
我只是想知道你是否可以在脚本中使用相同的命令?
答案 0 :(得分:2)
是的,相当于一个班轮的脚本如下:
local @ARGV = 'file';
local $^I = '';
while (<>) {
s/oldtext/newttext/g;
print;
}
只需搜索$INPLACE_EDIT
了解详情。
答案 1 :(得分:0)
当然,它的形式略有不同:
use strict;
use warnings;
my $filename = $ARGV[0]
or die "Must supply filename";
my $file;
{ # read the file into a single scalar
open(my $fh, '<', $filename)
or die "Can't open '$filename': $!\n";
local $/;
$file = <$fh>;
}
# apply your substitution
$file =~ s/oldtext/newtext/g;
{ # overwrite existing file with changes
open(my $fh, '>', $filename)
or die "Can't create '$filename': $!\n";
print {$fh} $file;
}
答案 2 :(得分:0)
Perl并不了解bourne shell,但您可以使用system
启动shell来为您执行它。 (对于更复杂的需求,IPC :: Run3和IPC :: Run等模块非常有用。)
system('sh', '-c', q{perl -p -i -e 's/oldtext/newttext/g' file});
system
的替代语法允许您将上述内容简化为以下内容:
system(q{perl -p -i -e 's/oldtext/newttext/g' file});
但是!但是,您可以直接启动perl
,而不是告诉shell启动perl
。
system('perl', '-p', '-i', '-e', 's/oldtext/newttext/g', 'file');
但是!您可以将两个程序合并在一起,而不是启动第二个perl
。
local @ARGV = 'file';
local $^I = '';
while (<>) {
s/oldtext/newttext/g;
print;
}