Похоже, вы хотите волшебство редактирования на месте. Самый простой способ получить это - использовать $^I
с магией @ARGV
плюс <>
(ищите нулевой дескриптор файла в разделе Операторы ввода / вывода ):
#!/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