它看起来像你想就地编辑魔法所取代。得到这个最简单的方法是使用$^I
与@ARGV
加<>
魔术(寻找在I/O Operators section空文件句柄):
#!/usr/bin/perl
use strict;
use warnings;
my $find = qr/\s{6}seqfile\s=\sinfile/;
my $replace = ' seqfile = infil2';
@ARGV = ("/home/shubhi/Desktop/pamlrun/test");
$^I = ".bak"; #safe the old files as file.bak
while (<>) {
s/$find/$replace/g;
print;
}
此外,鉴于你的正则表达式的性质,它看起来像你可能想[ ]
(匹配空格)或\t
(与选项卡匹配)而不是\s
。 \s
将匹配制表符,空格和其他空白字符。
您还可以使用Tie::File
,但它似乎并没有提供一个备份功能:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
my $find = qr/\s{6}seqfile\s=\sinfile/;
my $replace = ' seqfile = infil2';
tie my @lines, "Tie::File", "testdata"
or die "could not open file: $!";
for my $line (@lines) {
$line =~ s/$find/$replace/g;
}
当然,你可以用File::Copy
推出自己的备份:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
use File::Copy;
my $find = qr/\s{6}seqfile\s=\sinfile/;
my $replace = ' seqfile = infil2';
copy "testdata", "testdata.bak"
or die "could not backup file: $!";
tie my @lines, "Tie::File", "testdata"
or die "could not open file: $!";
for my $line (@lines) {
$line =~ s/$find/$replace/g;
}
如果我没有指出这基本上是一行代码,我也会失职:
perl -pi.bak -e 's/\s{6}seqfile\s=\sinfile/ seqfile = infil2/' testdata
这可以用Perl 5.10进一步采取的\K
(零宽度正向后看)的优势被缩短:
perl -pi.bak -e 's/\s{6}seqfile\s=\s\Kinfile/infil2/' testdata
我觉得领带::文件更加容易。 – Svante 2009-06-02 19:42:13