Perl 맵에서 아무것도 반환하지 않는 이유는 무엇인가요?

다음 문을 실행할 때

@filtered = map {s/ //g} @outdata;

를 실행하면 예상했던 필터링된 목록 대신 빈 목록이 반환됩니다. 제가 하고자 하는 것은 문자열 배열(XML 파일)에서  가 있는 모든 항목을 제거하는 것입니다.

분명히, 나는 무언가를 이해하지 못하고 있습니다. 누구든지이 작업을 수행하는 올바른 방법과 이것이 저에게 그대로 작동하지 않는 이유를 말해 줄 수 있습니까?

질문에 대한 의견 (1)

맵은 소스 배열도 수정한다는 점에 유의하세요. 따라서 둘 중 하나를 사용할 수 있습니다:

map {s/ //g} @outdata;

를 사용하여 @filtered 변수를 완전히 건너뛰거나 원본을 유지해야 하는 경우입니다,

@filtered = @outdata;
map {s/ //g} @filtered;

이 경우 foreach를 사용하는 것이 더 가독성이 높을 수 있습니다:

s/ //g foreach @filtered;
해설 (1)
해결책

이렇게 해보세요:

@filtered = map {s/ //g; $_} @outdata;

문제는 perl의 s 연산자가 $_를 수정하지만 실제로는 변경한 횟수를 반환한다는 것입니다. 따라서 끝에 $_를 추가하면 perl이 @outdata의 각 요소에 대해 수정된 문자열을 반환하게 됩니다.

해설 (3)

39 에 문제가 있는 것으로, 원래 배열을 수정하십시오 오토메이티드 greg& s $ _ 로 가칭된 전달됩니다. 합니다.

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
해설 (0)

39 의 후속 조치를 할 수 있는 점, 또한 Tithonium& 의심하게 된다.

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

이 &quot local"; # 39 는 you&, re working on a copy) 가 아닌 원본.

해설 (0)

펄 (perl) 에서 5.14 수정자의 /r regex 를 사용할 수 있습니다 ([제조업체 비파괴적인 대체] http://perldoc.perl.org/perl5140delta.html # 정규 표현식).

@filtered = map {s/ //gr} @outdata;
해설 (0)
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
해설 (0)

Greg의 답변에 대한 반론으로, grep을 잘못 사용할 수 있습니다:

@filtered = grep {s/ //g; 1} @outdata;

하지 마세요.

해설 (0)