它看起來像你想就地編輯魔法所取代。得到這個最簡單的方法是使用$^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