왜 내 Perl Map이 값을 반환하지 않나요?

Perl을 작업하고 있는데 map 함수가 빈 리스트를 반환한다면, 당신만 그런 것이 아닙니다. 이 문제는 특히 배열 내 문자열을 조작하려 할 때 개발자들을 혼란스럽게 만들곤 합니다. 이 블로그 포스트에서는 문자열에서 불필요한 문자를 필터링하는 특정 사례를 살펴보고, 이 일반적인 문제를 단계별로 해결하는 방법을 설명합니다.

문제

문제를 일으키는 코드 조각을 살펴보겠습니다:

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

이 줄에서:

  • 당신은 XML 데이터를 포함하는 문자열 배열 @outdata의 내용을 필터링하려고 하고 있습니다.
  • 특히 HTML에서 비안전 공백을 나타내는 모든   인스턴스를 제거하고자 합니다.

그러나 수정된 배열을 반환하는 대신, 코드가 빈 리스트를 반환하고 있습니다. 도대체 무엇이 잘못된 걸까요?

문제 이해하기

주요 문제는 Perl에서 치환 연산자 s///가 어떻게 작동하는지에 있습니다. 간단히 설명하자면:

  • s/// 연산자는 문자열을 제자리에서 수정하지만 (이 경우 기본 변수 $_), map 함수에서 사용할 수정된 문자열을 반환하지 않습니다.
  • 대신, 문자열에 대한 변경 횟수를 반환합니다. 즉, 변경이 없을 경우 반환 값은 0일 수 있으며, 이후의 사용을 위해 예상 문자열이 전달되지 않을 수 있습니다.

결과적으로, 이 방법으로 map을 사용하면 원하는 문자열을 @filtered에 수집하지 않게 되어 빈 리스트가 발생하게 됩니다.

해결책

원하는 필터 효과를 달성하려면, 치환이 실제로 수술 후 수정된 문자열을 반환하도록 해야 합니다. 이를 달성하는 방법은 다음과 같습니다:

map 함수의 올바른 구문

map 블록의 끝에 변수 $_를 포함하여 코드를 수정하십시오:

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

수정된 코드에 대한 설명

  1. s/ //g; - 이 부분은 치환을 수행하여 $_에서 모든   인스턴스를 제거합니다.
  2. $_ - 이제 각 반복에 대해 $_의 값을 명시적으로 반환합니다 (수정된 문자열). 이렇게 하면 결과 리스트(@filtered)가 @outdata에서 변경된 요소를 포함하게 됩니다.

추가 팁

  • map에서 치환 연산자를 사용할 때, 수정된 문자열을 반환하고 싶다면 블록의 끝에 반드시 포함해야 한다는 점을 항상 기억하십시오.
  • 처리하기 전에 @outdata가 비어 있지 않거나 잘 형성되었는지 확인하기 위한 검증 체크를 추가할 수도 있습니다.

결론

결론적으로, Perl map 문이 빈 리스트를 반환하는 것을 발견한 경우, 치환 연산을 확인하세요. 치환 후 $_를 올바르게 반환함으로써, 의도한 대로 데이터를 효과적으로 처리하고 필터링할 수 있습니다. 이 단순하지만 중요한 조정은 빈 출력으로 인한 불만을 줄여주며, 더 복잡한 작업에 집중할 수 있도록 도와줍니다.

이제 Perl로 즐거운 코딩 하세요!