다른 배열에있는 목록의 요소 제외

Aug 20 2020

@exclude = ("[INFO] Reading file", "[INFO] All file(s) read");다른 배열을 반복하는 동안 무시하고 싶은 항목 이 포함 된 배열을 만들고 싶습니다.

다른 배열은 파일에서 준비한 @nyuulog이며 다음과 유사합니다.

[INFO] Uploading 37 article(s) from 3 file(s) totalling 23.98 MiB```
[INFO] Reading file 157.1.1.par2...
[INFO] Reading file 159.1.1.rar...
[INFO] Reading file 159.1.1.vol0+1.par2...
[INFO] All file(s) read...
[INFO] Finished uploading 23.98 MiB in 00:00:16.083 (1527.03 KiB/s). Raw upload: 2613.34 KiB/s

그래서 저는 이것을 사용하고 있습니다 :

foreach $line(@nyuulog) {print $txtfile("$line\n");}

모든 줄을 쓰지만 @exclude 배열에 요소를 포함하는 파일 핸들에 줄을 쓰지 않기를 원합니다.

이 작업을 수행하는 쉬운 방법이 있습니까? grep 또는 새로운 Perl ~~ 명령 (이 상황에서는 적용되지 않는다고 생각합니다)을 사용하여 여러 번 시도했지만 올바른 명령 조합을 얻을 수 없습니다.

도움을 주거나 올바른 방향으로 안내해 주시면 대단히 감사하겠습니다.

감사합니다

답변

2 Light Aug 21 2020 at 03:06

이 시도:

my $FilterRe = join("|", map({"(^\Q$_\E)"} @exclude));
my @Filtered = grep({!/$FilterRe/} @nyuulog);

Perlmonks 에 대한 질문에서 영감 을 얻었습니다 .

3 zdim Aug 21 2020 at 04:59

제외 할 항목에 대한 조회 해시를 구성하고이를 사용하여 배열을 필터링합니다.

my %excl = map { $_ => 1 } @exclude; my @filtered = grep { not $excl{$_} } @original; 

이것은 목록 처리가 O (N) 할 수있는 것만 큼 효율적 이며 명확하고 쉽습니다.

do추가 변수 ( %excl)가 떠 다니는 것을 피하기 위해 블록 에 포함 할 수도 있습니다.

my @filtered = do { 
    my %excl = map { $_ => 1 } @exclude;
    grep { not $excl{$_} } @original;
};