2017-04-01 2 views
1

다음 코드는 실제로 @ arr0과 @ arr1이 같지 않습니다. 정렬 후에도 동일하지는 않지만 "eq"가 인쇄되는 이유는 무엇입니까? 처음에는 정렬 함수의 반환 값을 생각했지만 배열을 반환 했으므로 이유가 무엇입니까?perl 스마트 정렬을 사용하여 정렬 된 배열 비교

my @arr0 = (1,2); 
my @arr1 = ("a","b"); 

if ((sort @arr0) ~~ (sort @arr1)) { 
    print "eq\n"; 
}; 
+0

어떤 Perl 버전을 사용하고 있습니까? 스마트 매치 연산자가 몇 번 변경되었습니다. 유스 케이스 배열과 배열이 영향을 받았는지는 기억이 나지 않지만, 더 잘 말해주십시오. – simbabque

+0

Perl 버전은 v5.12.1입니다. 감사합니다. – orange

+0

현재 5.24.1 동작으로 배열의 각 쌍에서 문자열을 동일하게 처리해야합니다. 하지만 목록이 아니라 배열이 있습니다. 그것은 차이를 만들 수 있습니다. 어쩌면 그들은 스칼라 맥락으로 강요 당할 수도 있습니다. 나는 지금 컴퓨터가 없다. 배열을 직접 넣으십시오. – simbabque

답변

2

[참고 :이 답변의 문서에 모든 링크는 버전 5.12.1에 대한 문서입니다. 이렇게하면 원래의 포스터에 대한 대답이 유용하므로 다른 사람들에게 유용하지 않을 수 있습니다.]

배열과 목록이 동일하지 않다는 것을 알아야합니다. 이것은 행동이 다른 경우입니다.

는 말로 시작 documentation for sort()을 읽는 것도 중요 :리스트 문맥에서

,이 목록을 정렬하고 정렬 된 목록 값을 반환합니다. 스칼라 컨텍스트에서는 sort()의 동작이 정의되지 않습니다.

두 가지 중요한 점이 있습니다. 첫째, 목록 컨텍스트에서 sort()은 배열이 아닌 목록을 반환합니다. 둘째, 스칼라 문맥에서 그 행동은 정의되지 않았다.

이제 smartmatch documentation을 살펴 보겠습니다. 이것은 내가 여기에서 재현하지 않을 큰 피연산자입니다. 그러나 그것은 목록을 전혀 언급하지 않는다는 점에 유의하십시오. 따라서 거의 확실하게 smartmatch는 스칼라 컨텍스트에서 sort()을 호출하고 문자열 또는 숫자 비교 (테이블의 마지막 몇 행 중 하나)을 수행합니다.

그러나 우리는 스칼라 컨텍스트에서 sort()의 동작이 정의되지 않았 음을 알고 있습니다. 따라서 스마트 마트가 어떤 가치를 지니고 있는지 알 수 있습니다. 그러나 임의의 값을 돌려 주면 다른리스트에 대해 동일한 임의의 값을 반환하는 것입니다 (적어도). 그것은 그들이 평등 한 것처럼 보인다는 것을 의미합니다.

주석에서 말했듯이 정렬 된 결과를 배열에 저장하고 배열을 smartmatch에 전달할 때 작동합니다. 배열은 smartmatch 테이블에 정의 된 특별한 동작을 가지고 있기 때문입니다.

  • 배열은 스칼라 문맥에서 sort()를 호출하지 마십시오 목록
  • 하지

업데이트 : 코멘트에 언급ThisSuitIsNotBlack로는 펄 5.10에 도입 된 이후, smartmatch 오히려 불안정하고있다 . 그것의 행동은 그 이후로 거의 모든 Perl 릴리스에서 수정되었으며 최종 형식은 여전히 ​​완전히 동의되지 않았습니다. 그런 이유로, 나는 그것을 전혀 사용하지 말 것을 강력히 권합니다.

+1

세 번째 글 머리 기호를 추가합니다. 스마트 마커를 사용하지 마십시오. 실험적이며 앞으로는 확실히 바뀔 것입니다. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot : 그렇습니다. 알림 주셔서 감사. 나는 내 대답에 그것을 추가했습니다. –

+0

Re "* 그 행동은 Perl이 출시 된 후 거의 모든 버전에서 수정되었습니다." "사실이 아닙니다. 두 가지 변경 사항 만있었습니다 : 5.10.1 (기능 변경) 및 5.18 (실험으로 표시됨). – ikegami