[英]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.