您有一个非常严格的正则表达式来查找 XML 标头。如果有多余的空格怎么办?如果编码不同,或者xml版本不同怎么办?正则表达式不是解析 XML/HTML 的正确工具(请参阅此答案),但是可以理解为什么要使用正则表达式,尤其是考虑到您尝试做的事情的范围有限。
话虽如此,如果您为了简单起见,并且愿意接受一些可能的失败,我会选择更简单的正则表达式,并且只进行一次替换:
my $replaced = 0;
if ($inputline =~ m/\<\?xml\b.*\>/ && !$replaced) {
print OUTPUT $inputline;
print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."\n";
$replaced = 1;
}
或者,您可以退出解析循环,假设这就是您在循环中所做的一切。
警告:
- 如果您的 XML 都写在一行上,或者即使在同一行上还有另一个标签(这是合法的),这很可能会破坏您的 XML。
编辑:
您的整个while
循环可能如下所示:
while($inputline = <MYXML>) {
my $replaced = 0;
if ($inputline =~ m/\<\?xml\b.*\>/ && !$replaced) {
print OUTPUT $inputline;
print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."\n";
$replaced = 1;
} else {
print OUTPUT $inputline;
}
}
或者:
while($inputline = <MYXML>) {
my $replaced = 0;
print OUTPUT $inputline;
if ($inputline =~ m/\<\?xml\b.*\>/ && !$replaced) {
print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."\n";
$replaced = 1;
}
}