Perl:使用grep删除与模式匹配的数组元素,并且不匹配另一个元素

时间:2014-05-27 10:02:28

标签: arrays regex perl grep

我有两个包含以下元素的数组:

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中。

1 个答案:

答案 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;
}

我认为你应该可以离开这里。