我需要将文件中的标记(<stats>...</stats>
)之间的多行文本替换为Perl中其他文件中的另一个多行文本。我正在使用搜索和替换功能但目前无法正常工作。如果开始标记和结束标记都在同一行,那么我可以替换它们,否则它不会被替换。对于Ex,在目标文件中:
.
.
.
<stats>
<stat type="string" value="a" />
<stat type="string" value="b" />
<stat type="string" value="c" />
<stat type="string" value="d" />
</stats>
.
.
.
.
我的代码段的一部分如下:
my $replacetext="<stats>"."@lines"."</stats>";
my $searchtext="<stats>.*</stats>";
# Here @file_lines is the array containing destination file and @lines is the array containing source file.
foreach (@file_lines)
{
$_=~ s/$searchtext/$replacetext/g;
}
仅当起始标记和结束标记位于同一行时, '.*'
才有效。
答案 0 :(得分:3)
<{3}} 不正常。正如@mu所提到的,尝试使用XML解析器 - 例如,您可以使用parse HTML/XML with regexes实现所需的目标。
查看教程XML::Simple
这比您需要的更多,但会为您提供 Perl
中使用XML 的良好介绍答案 1 :(得分:2)
不要使用正则表达式来解析XML。使用XML解析器。
使用XML::XSH2的示例,XML::LibXML的包装:
my $source ;
$source = { open my $SOURCE, '<', 'source.xml' or die $! ; local $/ ; <$SOURCE> } ;
open destination.xml ;
for //stats {
rm ./* ;
insert chunk $source into . ;
}
save :b ;
答案 2 :(得分:1)
虽然使用XML库通常是正确的做法,但是如果文件不是太大并且您不希望实际解析和遍历的开销,您仍然可以快速而肮脏的方式执行此操作。 XML(例如,只需要很小的更改)。但是,这样做非常脆弱
my $joined_file = join "\n", @file_lines; # one long multi-line string
$joined_file =~ s/$searchtext/$replacetext/sg; # s means multi-line
my @updated_file_lines = split /\n/, $joined_file; # result