【发布时间】:2016-12-11 21:37:57
【问题描述】:
我正在尝试使用 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对数组进行操作并返回匹配的元素。也许你的意思是$terms[$ind] =~ /$filter/匹配一个? -
是的,看起来像预期的那样工作 - 谢谢!我仍然对为什么数组没有像我之前所做的那样缩小感到困惑。
-
从您正在迭代的数组中删除元素总是很棘手。每次拼接时,偏移量都会移动 1。
-
FWIW,
use VERSION仅指定所需的最低版本;它不模拟 Perl 解释器,因为它存在于该版本中。
标签: arrays perl array-difference