0

<stats>...</stats>ファイル内のtags()間の複数行のテキストを、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;
}

'.*'開始タグと終了タグが同じ行にある場合にのみ機能します。

4

3 に答える 3

3

HTML/XML を regexes でパースするのは良くありません。@mu が述べたように、XML パーサーを使用してみてください。たとえば、必要なものを実現できます。XML::Simple

Perl 開発者向けの XML チュートリアル、パート 1: XML と Perl -- 単純な魔法をご覧ください。

これは必要以上のものですが、Perl で XML を操作するための優れた入門書なります。

于 2012-11-04T07:17:12.643 に答える
2

XML の解析に正規表現を使用しないでください。XML パーサーを使用します。

XML::LibXMLのラッパーであるXML ::XSH2を使用した例:

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 に答える