在perl脚本中使用命令行

时间:2014-08-08 21:11:39

标签: perl

我知道你可以在命令中运行这样的命令

perl -p -i -e 's/oldtext/newttext/g' file

我只是想知道你是否可以在脚本中使用相同的命令?

3 个答案:

答案 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;
}