gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:39:55 25 4
gpt4 key购买 nike

我正在尝试使用 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;
}
}
}

这可以拉出与各种搜索词匹配的行,但数组长度不会改变。如果我写出结果 @terms数组,我得到:
[alpha]
[delta quadrant]
[zeta]
[eta]
[theta chi]
[kappa]
[]
[]
[]
[]

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

我想要的是一个长度为 6 的结果数组,最后没有四个空白项。我如何得到这个结果?考虑到 perldoc page about splice ,为什么数组没有缩小?说,“阵列根据需要增长或缩小。”?

(我对 Perl 不是很流利,所以如果你在想“你为什么不只是......?”,这几乎可以肯定是因为我不知道或者当我听说的时候不理解它。)

最佳答案

你总是可以重新生成数组减去你不想要的东西。 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";

如果你有一个简单的结构,比如 %filter_exclusion,那就很容易了。手上。

更新 :如果你想允许任意子串匹配:
my $filter_exclusion = join '|', map quotemeta, @filters;

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

关于arrays - Perl:删除数组项并调整数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com