我有两个包含以下元素的数组:
my @type = ("man", "boy");
my @array = (
"=stat_man",
"=stat_boy"
"=ref_g_man",
"=g_man",
"=g_boy",
"=happy_man" ,
"an element",
"another element",
"=ref_g_boy"
);
作为一个选项,我想只删除 @array 中包含字符串'stat'的行,在另一种情况下,我希望它删除不包含字符串的元素'stat',但包含@type的元素。所以我写道:
foreach my $type (@type) {
if(condition) {
@array = grep {! /stat_$type/}@array; #works. Deletes elements with 'stat'
}
else {
@array = grep {! /(?!stat)_$type/}@array; #sort of...works
}
}
好的,现在我在这里被卡住了。在else中,所有包含$ type且不包含'stat'的元素都将被删除。哪个好。 但我想要的是第二个grep只删除包含$ type的元素,不包含'stat'和不删除前缀由1个单词组成的元素。
例如,我想要
"=g_man" , "=g_boy" and "=happy_man" deleted, but not "=ref_g_man" and "=ref_g_boy".
如果我在第二个grep中添加(?!stat)前面的任何内容,它就不起作用。
基本上,我不知道如何将第三个条件添加到grep中。
答案 0 :(得分:2)
您正在尝试同时解析和过滤,这会变得混乱。最好分开做。我会把解析部分留给你,你更了解数据。你可能会想出这样的东西。
my @stuff = (
{ type => "man", stat => 1 },
{ type => "boy", stat => 1 },
{ type => "man", g => 1, ref => 1 },
...
);
然后过滤变得更容易。
for my $type (@types) {
@stuff = grep { $_->{type} eq $type } @stuff;
}
我认为你应该可以离开这里。