我是perl的初学者。我必须从html文件中搜索字符串John
并且我必须替换文本。我已经完成并且文本已被替换但是它没有保存在文件中我附上了我试过的代码。谢谢!。
#!/usr/bin/perl
use strict;
use warnings;
my $file = 'index.html';
open my $fh, '<', $file or die "Could not open '$file' $!\n";
while (my $line = <$fh>) {
chomp $line;
if($line =~ /John/){
$line =~ s/John/Bush/ig;
print $line;
}
}
close($fh);
答案 0 :(得分:4)
不,它不会。您正在读取文件并进行搜索并替换内存中的数据。然后你将print
行重新加入STDOUT。
如果你想这样做,那么你可以使用-pi
标志将perl用作一种超级sed。 (看看perlrun
)
或者您需要自己处理读/写数据。
e.g:
#!/usr/bin/perl
use strict;
use warnings;
my $file = 'index.html';
open my $fh, '<', $file or die "Could not open '$file' $!\n";
open my $output_fh, '>', $file . ".new" or die $!;
while ( my $line = <$fh> ) {
$line =~ s/John/Bush/ig;
print {$output_fh} $line;
}
close($fh);
close($output_fh);
应该注意 - 如果&#39;你不需要那个&#39;因为&#sed风格&#39;如果没有初始匹配,则替换(s/sometext/othertext
)不会做任何事情。你也不需要chomp
,因为它会删除换行符 - 如果你正在修改文件,你会想要再次放回它们。 (可能!)
编辑:对于奖励积分,这应该做你想要的:
perl -pi.bak -e 's/John/Bush/gi' index.html
答案 1 :(得分:2)
您必须打开一个新文件进行书写并将替换后的文本打印到其中。
#!/usr/bin/perl
use strict;
use warnings;
my $file = 'index.html';
open my $fh, '<', $file or die "Could not open '$file' $!\n";
open my $fh1, '>', $file."new" or die "Could not open '$file' $!\n";
while (my $line = <$fh>) {
chomp $line;
if($line =~ /John/){
$line =~ s/John/Bush/ig;
}
print $fh1 $line;
}
close($fh);
close($fh1);