Perlで別の配列を使って配列の配列をフィルタリングしようとしています。私はOS X上でPerl 5.18.2を持っていますが、もし私がuse 5.010
なら振る舞いは同じです。Perl:配列項目の削除と配列のサイズ変更
#!/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の結果の配列で、最後に4つの空白の項目はありません。その結果をどうやって得るのですか? perldoc page about splice
に「配列は必要に応じて拡大または縮小します」という意味で、配列が縮小しないのはなぜですか?
(私はPerlにはあまり慣れていないので、「なぜあなただけではないの?」と思っているなら、私はそれを知らない、または理解していない
'grep'は配列に対して動作し、一致する要素を返します。たぶん、$ terms [$ ind] =〜/ $ filter/'を1つのものにマッチさせることを意味するでしょうか? – tadman
うん、それは意図したとおりに動作するように見える - ありがとう!私はまだ配列が私が以前にやっていたもので収縮しなかった理由について混乱しています。 –
積極的に反復処理している配列から要素を削除するのは、常に難しいことです。何かをスプライスするたびにオフセットが1ずつシフトします。 – tadman