0

我需要用<stats>...</stats>Perl 中其他文件中的另一个多行文本替换文件中 tags() 之间的多行文本。我正在使用搜索和替换功能,但目前不工作。如果开始标签和结束标签都在同一行,那么我可以替换它们,否则它不会替换。对于 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;
}

'.*'仅当开始标签和结束标签在同一行时才有效。

4

3 回答 3

3

用 regexes 解析 HTML/XML不行的。正如@mu 提到的,尝试使用 XML 解析器 - 例如,您可以实现您想要的。XML::Simple

查看面向 Perl 开发人员的 XML 教程,第 1 部分:XML 加 Perl——简直是魔法

它超出了您的需要,但会为您提供在Perl中使用 XML的很好的介绍

于 2012-11-04T07:17:12.643 回答
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 ;
于 2012-11-04T07:41:52.210 回答
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
于 2012-11-05T04:22:22.193 回答