簡體   English   中英

Perl 正則表達式數組 — 匹配數組元素

[英]Perl Array of regular expressions — matching elements of an array

我正在嘗試從名為@array的數組中匹配和刪除元素。 要刪除的元素必須與存儲在名為@del_pattern的數組中的模式相匹配

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

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

為了從@array刪除@del_pattern包含的模式,我遍歷@del_pattern所有元素並使用grep 排除它們。

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

但是,我一直無法從@array刪除',' 如果我在@del_pattern使用','而不是'\\b,\\b' ,元素port_b,@array刪除,這不是預期的結果。 我只對刪除僅包含','元素感興趣。

您使用了錯誤的正則表達式。 我更新了代碼並嘗試了它並且它工作正常。 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);
    }
}

所做的唯一更改是將正則表達式 '\\b,\\b' 更改為 '^,$'。 我沒有太多關於 \\b 的信息,但我建議的正則表達式正在做你想要的。

你要

^,\z

下面是對\\b根本不匹配的解釋。


\b

定義“詞”的邊界。 它相當於

(?<=\w)(?!\w) | (?<!\w)(?=\w)

所以

\b,\b

相當於

(?: (?<=\w)(?!\w) | (?<!\w)(?=\w) ) , (?: (?<=\w)(?!\w) | (?<!\w)(?=\w) )

由於逗號是非單詞字符,因此簡化為

(?<=\w),(?=\w)

所以

'a,b' =~ /\b,\b/      # Match
','   =~ /\b,\b/      # No match

這有效,但從代碼來看不是很好。 此代碼段還刪除了“,”

 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有數組? 為什么不是一個大陣列?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM