2016-05-20 12 views
1
use strict; 
use warnings; 
use XML::Twig; 
my @discard = qw/abc de bond/; 
my $filter = join '|', @discard; 
$filter = qr/\b(?:$filter)\b/; 
my $twig = XML::Twig->new; 
$twig->parse(\*DATA); 
for my $line ($twig->findnodes('//line')) { 
    $line->delete if $line->text =~ $filter; 
} 
$twig->print; 

__DATA__ 
<data> 
    <line> sdfe abc adsfefsdf </line> 
    <line> abcsdffedcfsdf sdf </line> 
    <line> sdfe </line> 
    <line> abc </line> 
    <line> sdabc sfefsdf </line> 
    <line> 
     <id> bond </id> 
     <dest> UK </dest> 
     adsfefsdf 
    </line> 
    <line> fhgh kk jj hjsda </line> 
    <line> abc </line> 
    .. 
    .. 
    .. 
</data> 

上記プログラムは、以下の結果生成後読み:パターンマッチ - 先読みと

<data><line> abcsdffedcfsdf sdf </line><line> sdfe </line><line> sdabc sfefsdf </line><line> fhgh kk jj hjsda </line> 
    .. 
    .. 
    .. 
</data> 

ザは、以下が所望の出力である:

<data> 
<line> sdfe </line> 
<line> fhgh kk jj hjsda </line> 
    .. 
    .. 
    .. 
</data> 

所望の出力のために考慮されるための条件を:

  1. 一致、事前一致、事後一致、配列内に入力された値を入力し、それらが存在する入力データからタグを削除する
    例: 一致---- abc
    事前一致---- sdabc
    POSTMATCH ----

  2. abcsdffedcfsdf上記のように**マッチ、PREMATCHとPOSTMATCHは私の用語であり、出力の形式は、入力データ

と同様の方法であることを確認してください。

答えて

1

@discardの文字列で開始または終了する単語を含む要素を除外する方法を質問していますか?その場合は、単純に次のように検索パターンを置き換える:

my $filter = join '|', map quotemeta, @discard; 
$filter = "(?:$filter)"; 
$filter = qr/\b$filter|$filter\b/; 

出力:

<data><line> sdfe </line><line> fhgh kk jj hjsda </line> 
    .. 
    .. 
    .. 
</data> 
+0

絶対に!ありがとうございました。 –