Perl:删除数组项并调整数组大小

Eri*_*yer 4 arrays perl array-difference

我正在尝试使用Perl中的另一个数组来过滤一个术语数组.我在OS X上有Perl 5.18.2,但如果我的行为是相同的use 5.010.这是我的基本设置:

#!/usr/bin/perl
#use strict;
my @terms = ('alpha','beta test','gamma','delta quadrant','epsilon',
             'zeta','eta','theta chi','one iota','kappa');
my @filters = ('beta','gamma','epsilon','iota');
foreach $filter (@filters) {
    for my $ind (0 .. $#terms) {
        if (grep { /$filter/ } $terms[$ind]) {
            splice @terms,$ind,1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以拉出与各种搜索项匹配的行,但数组长度不会改变.如果我写出结果@terms数组,我得到:

[alpha]
[delta quadrant]
[zeta]
[eta]
[theta chi]
[kappa]
[]
[]
[]
[]
Run Code Online (Sandbox Code Playgroud)

正如您可能期望的那样,打印scalar(@terms)得到了结果10.

我想要的是一个长度为6的结果数组,最后没有四个空白项.我如何得到这个结果?为什么阵列不会缩小,因为perldoc页面上splice说"阵列会根据需要增长或缩小".

(我对Perl不是很流利,所以如果你在想"你为什么不......?",几乎可以肯定是因为我听说不知道或不理解它它.)

tad*_*man 7

您可以随时重新生成数组,减去您不想要的内容.grep充当过滤器,允许您决定您想要哪些元素,哪些元素不需要:

#!/usr/bin/perl

use strict;

my @terms = ('alpha','beta test','gamma','delta quadrant','epsilon',
           'zeta','eta','theta chi','one iota','kappa');
my @filters = ('beta','gamma','epsilon','iota');

my %filter_exclusion = map { $_ => 1 } @filters;

my @filtered = grep { !$filter_exclusion{$_} } @terms;

print join(',', @filtered) . "\n";
Run Code Online (Sandbox Code Playgroud)

如果你%filter_exclusion手头有一个简单的结构,这很容易.

更新:如果要允许任意子字符串匹配:

my $filter_exclusion = join '|', map quotemeta, @filters;

my @filtered = grep { !/$filter_exclusion/ } @terms;
Run Code Online (Sandbox Code Playgroud)