[참고 :이 답변의 문서에 모든 링크는 버전 5.12.1에 대한 문서입니다. 이렇게하면 원래의 포스터에 대한 대답이 유용하므로 다른 사람들에게 유용하지 않을 수 있습니다.]
배열과 목록이 동일하지 않다는 것을 알아야합니다. 이것은 행동이 다른 경우입니다.
는 말로 시작 documentation for sort()
을 읽는 것도 중요 :리스트 문맥에서
,이 목록을 정렬하고 정렬 된 목록 값을 반환합니다. 스칼라 컨텍스트에서는 sort()의 동작이 정의되지 않습니다.
두 가지 중요한 점이 있습니다. 첫째, 목록 컨텍스트에서 sort()
은 배열이 아닌 목록을 반환합니다. 둘째, 스칼라 문맥에서 그 행동은 정의되지 않았다.
이제 smartmatch documentation을 살펴 보겠습니다. 이것은 내가 여기에서 재현하지 않을 큰 피연산자입니다. 그러나 그것은 목록을 전혀 언급하지 않는다는 점에 유의하십시오. 따라서 거의 확실하게 smartmatch는 스칼라 컨텍스트에서 sort()
을 호출하고 문자열 또는 숫자 비교 (테이블의 마지막 몇 행 중 하나)을 수행합니다.
그러나 우리는 스칼라 컨텍스트에서 sort()
의 동작이 정의되지 않았 음을 알고 있습니다. 따라서 스마트 마트가 어떤 가치를 지니고 있는지 알 수 있습니다. 그러나 임의의 값을 돌려 주면 다른리스트에 대해 동일한 임의의 값을 반환하는 것입니다 (적어도). 그것은 그들이 평등 한 것처럼 보인다는 것을 의미합니다.
주석에서 말했듯이 정렬 된 결과를 배열에 저장하고 배열을 smartmatch에 전달할 때 작동합니다. 배열은 smartmatch 테이블에 정의 된 특별한 동작을 가지고 있기 때문입니다.
- 배열은 스칼라 문맥에서
sort()
를 호출하지 마십시오 목록
- 하지
업데이트 : 코멘트에 언급ThisSuitIsNotBlack로는 펄 5.10에 도입 된 이후, smartmatch 오히려 불안정하고있다 . 그것의 행동은 그 이후로 거의 모든 Perl 릴리스에서 수정되었으며 최종 형식은 여전히 완전히 동의되지 않았습니다. 그런 이유로, 나는 그것을 전혀 사용하지 말 것을 강력히 권합니다.
어떤 Perl 버전을 사용하고 있습니까? 스마트 매치 연산자가 몇 번 변경되었습니다. 유스 케이스 배열과 배열이 영향을 받았는지는 기억이 나지 않지만, 더 잘 말해주십시오. – simbabque
Perl 버전은 v5.12.1입니다. 감사합니다. – orange
현재 5.24.1 동작으로 배열의 각 쌍에서 문자열을 동일하게 처리해야합니다. 하지만 목록이 아니라 배열이 있습니다. 그것은 차이를 만들 수 있습니다. 어쩌면 그들은 스칼라 맥락으로 강요 당할 수도 있습니다. 나는 지금 컴퓨터가 없다. 배열을 직접 넣으십시오. – simbabque