나는 펄에서 다른 배열을 사용하는 용어의 배열을 필터링하기 위해 노력하고있어 크기를 조정. 필자는 Perl 5.18.2를 OS X에 가지고 있지만, 동작은 동일하다. (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
의 결과를 가져옵니다.
은 내가 원하는 말에 4 개 개의 빈 항목없이, 길이 6의 결과 배열입니다. 어떻게 결과를 얻을 수 있습니까? perldoc page about splice
에 "어레이가 필요에 따라 커지거나 줄어드는"것을 감안할 때 왜 어레이가 축소되지 않는가?
(당신이 "그냥 ...?하지 않는 이유", 그것은 거의 확실입니다 그것에 대해 모르거나 이해하지 않았기 때문에 생각하고 있다면 펄에서 매우 유창하지, 그래서 당신은 항상 배열 마이너스 일을 다시 할 수있을 때 그것에 대해 들었습니다.)
'grep' 배열과 요소를 일치 반환에 작동합니다. 아마 $ terms [$ ind] = ~/$ filter /'를 하나만 매치하는 것이 어떨까요? – tadman
네, 고의로 고맙습니다! 배열이 왜 내가 전에하고 있던 일로 줄어들지 않았는지 아직도 혼란 스럽다. –
적극적으로 반복하는 배열에서 요소를 제거하는 것은 항상 까다로운 작업입니다. 그것은 당신이 뭔가를 겹칠 때마다 오프셋을 1 씩 이동시킵니다. – tadman