我正在尝试在Perl中创建一个脚本来替换给定目录中所有HTML文件中的文本。但是,它不起作用。谁能解释我做错了什么?
my @files = glob "ACM_CCS/*.html";
foreach my $file (@files)
{
open(FILE, $file) || die "File not found";
my @lines = <FILE>;
close(FILE);
my @newlines;
foreach(@lines) {
$_ =~ s/Authors Here/Authors introduced this subject for the first time in this paper./g;
#$_ =~ s/Authors Elsewhere/Authors introduced this subject in a previous paper./g;
#$_ =~ s/D4-/D4: Is the supporting evidence described or cited?/g;
push(@newlines,$_);
}
open(FILE, $file) || die "File not found";
print FILE @newlines;
close(FILE);
}
例如,我想将“D4-”替换为“D4:是......”等等。谢谢,我会感激任何提示。
答案 0 :(得分:3)
您正在使用open
的两个参数版本。如果$file
未以“&lt;”,“&gt;”或“&gt;&gt;”开头,则会以读取文件句柄的形式打开。您无法写入读取文件句柄。要解决此问题,请使用open的三个参数版本:
open my $in, "<", $file or die "could not open $file: $!";
open my $out, ">", $file or die "could not open $file: $!";
另请注意使用词法文件句柄($in
)而不是裸字文件句柄(FILE
)。与omword文件句柄相比,Lexical文件句柄有许多好处:
您使用它们就像使用裸字文件句柄一样。
您可能需要考虑的其他事项:
$_
)s/foo/bar/;
而不是$_ =~ s/foo/bar/;
) 4号对你正在做的事情可能非常重要。如果您不确定这些HTML文件的格式,那么您可能很容易错过任何内容。例如,"Authors Here"
和"Authors\nHere"
对HTML来说意味着相同的东西,但是你的正则表达式会错过后者。您可能想看看XML::Twig
(我知道它说的是XML,但它也处理HTML)。这是一个非常容易使用的XML / HTML解析器。