map과 grep은 배열 작업을 위한 Perl의 강력한 함수입니다:
my @nums = (1, 2, 3, 4, 5, 6); my @squared = map { $_ * $_ } @nums; # (1, 4, 9, 16, 25, 36) my @even = grep { $_ % 2 == 0 } @nums; # (2, 4, 6)
map과 grep 블록 내에서 기본적으로 $_는 현재 요소를 포함합니다. $_을 수정하면 원래 배열의 요소 자체가 변경됩니다, 만약 배열이 참조로 전달되거나 foreach를 통해 $_이 명시적으로 사용될 경우.map은 항상 리스트를 반환하고, grep은 원래 리스트의 부분 집합을 반환합니다.질문: 다음 코드의 작동 원리와 이유는 무엇인가요?
my @nums = (1..5); my @result = map { $_++ } @nums; print "@nums ";
답변: 이 코드는 원래 배열 @nums를 변경하지 않습니다. $_++ 연산자는 블록 내에서 변수의 값을 증가시키지만, 이러한 변경 사항은 원래 배열에 저장되지 않으며, map은 변경된 값을 반환하지만 원래 배열은 영향을 받지 않습니다 (속성을 사용하지 않는 한).
my @nums = (1..5); my @result = map { $_++ } @nums; # @result는 (1,2,3,4,5)가 되고, @nums는 변경되지 않음 print "@nums "; # 출력: 1 2 3 4 5
이야기 어떤 프로젝트에서 개발자는
map { $_++ } @array이후에 원래 배열@array가 변경될 것이라고 기대하였습니다. 그 결과 프로그램은 오래된 값으로 계속 작동하며, 데이터 집계 시 잘못된 계산 결과를 초래했습니다.
이야기 보고 시스템에서
grep을 통해 배열을 필터링 할 때 블록 내에서 우연히$result = $_명령어를 사용하여 모든 요소가 동일한 변수에 재할당되어 데이터 출처가 손실되었습니다. 이는 디버깅을 복잡하게 하고 보고서 손실로 이어졌습니다.
이야기 통합 스크립트 코드에서 중첩된
map을 사용했지만 내부 컨텍스트도 공통 변수$_를 사용한다는 것을 잊어버려 요소 수정 시 예측할 수 없는 동작을 초래했습니다, 내부map이 결과 배열의 값을 덮어 썼습니다.