Похоже, что вы хотите в месте редактирования магии. Самый простой способ получить это использовать $^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
Я нахожу Tie :: Файл проще. – Svante