2017-05-17 17 views
0

@arrayという配列から要素を照合して削除しようとしています。アレイ内に格納されたパターンと一致している必要があり、除去すべき要素は@del_pattern内のすべての要素を、@arrayからIループを@del_patternに含まれるパターンを除去するとgrepを使用して、それらを排除するPerl正規表現の配列 - 配列の一致する要素

my @del_pattern = ('input', 'output', 'wire', 'reg', '\b;\b', '\b,\b'); 

my @array = (['input', 'port_a', ','], 
      ['output', '[31:0]', 'port_b,', 'port_c', ',']); 

@del_patternと呼ばれます。

## delete the patterns found in @del_pattern array 
foreach $item (@del_pattern) { 
    foreach $i (@array) { 
     @$i = grep(!/$item/, @$i); 
    } 
} 

しかし、私は@arrayから','を削除することができませんでした。 '\b,\b'の代わりに','@del_patternに使用すると、port_b,という要素も同様に意図された結果ではないので、@arrayから削除されます。私は','だけを含む要素の削除にのみ関心があります。

+0

唯一の単語を削除する代わりに '^ \、$'を使用してみてください。使用しているパターンは、その中にあるすべての単語を削除します。 – Mohit

+0

'@ array'に' input_a'があればそれは削除されるべきですか?言い換えれば、パターンは一致する必要がありますか等しいか?コンマの場合は、「** **のみ**、 '_」(私の強調)を含むようにする必要があります。 – zdim

+0

'@ array'に' input_a'があれば、それは削除されるべきではありません。パターンは一致する必要があります –

答えて

1

間違った正規表現を使用しています。私はコードを更新して、それを試してみました。 PFBの更新コード:

my @del_pattern = ('input', 'output', 'wire', 'reg', '\b;\b', '^,$'); 

my @array = (['input', 'port_a', ','], 
      ['output', '[31:0]', 'port_b,', 'port_c', ',']); 
## delete the patterns found in @del_pattern array 
foreach my $item (@del_pattern) { 
    foreach my $i (@array) { 
     @$i = grep(!/$item/, @$i); 
    } 
} 

Regex '\ b、\ b'から '^、$'に変更が加えられました。私は多くの情報を\ bは持っていませんが、私が提案している正規表現は、あなたが意図していることをやっています。

0

これは機能しますが、コードからはあまりうまくいきません。 このコードスニペットも削除 ''

my $elm = []; 

sub extract { 
    my $elm = shift; 

    foreach my $del (@del_pattern) { 
     $elm =~ s/$del//g; 
     if ($elm) { 
     return $elm; 
     } 
    } 
} 


foreach my $item (@array) { 
    foreach my $i (@$item) { 
     my $extract = extract($i); 
     if ($extract) { 
      push(@$elm, $extract); 
     } 
    } 
} 

print Dumper($elm); 

あなた@arrayが配列を持っているのはなぜ?なぜ1つの大きな配列ですか?

+0

ネストされた配列です。元の配列には、1行が要素である行のリストが含まれています。行は、区切り文字としてスペースで分割され、配列内に配列を形成します。バグがあればトレースする方が簡単なように構造化しました –

関連する問題