我正在尝试匹配并删除名为@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', ',']);
要从@del_pattern
中删除@array
中包含的模式,我会遍历@del_pattern
中的所有元素,并使用grep将其排除。
## 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 :(得分: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的信息,但我建议的正则表达式正在做你想要的。
答案 1 :(得分:1)
你想要
^,\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
答案 2 :(得分:0)
这可行,但代码不是很好。 此代码段还会删除&#39;,&#39;
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
有阵列?为什么不是一个大阵列?