【发布时间】:2017-10-16 09:37:05
【问题描述】:
我正在尝试从名为@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 中删除,这不是预期的结果。我只对删除仅包含 ',' 的元素感兴趣。
【问题讨论】:
-
尝试使用 '^\,$' 来删除仅包含 的单词,因为您使用的模式将删除所有包含 , 的单词。
-
所以如果你在
@array中有input_a应该被删除吗?换句话说,模式需要匹配还是相等?对于逗号,您说它应该相等——“that contains only,”(我的重点)。 -
如果我在
@array中有input_a,它不应该被删除。模式需要匹配 -
好的——但不是逗号?有了它,只有当它恰好是逗号时才删除元素?如果是这种情况,最有意义的是使该正则表达式
/^,$/,因此匹配它意味着它是相等的。 -
另外,你应该使用
qr/.../(不仅仅是单引号)来创建你的正则表达式。