지난번 포스팅에서 배열 정렬에 관해서 잠깐 다루었었습니다.
이 글을 보시면 배열에 관해 정리하면서 정렬도 다루었었는데요
sort 함수를 사용하면 정렬은 가능하지만 완벽하지는 않습니다.
예를들어 아래와 같은 상황이 발생되죠
숫자를 정렬한다고 가정합시다
숫자가 들어있는 somelist 배열에는 1,2,4,~ 256의 숫자가 들어있습니다.
그걸 sort 함수를 이용해서 정렬을 하면 아래와 같이 출력됩니다
이상하죠?
내가 원했던 정렬은 1,2,4,8 순서대로 가는 정렬인데요
1, 128, 16, 2, 256, 32, 4, 64, 8 순으로 정렬이 되어 있습니다.
자세히 보면 가장 맨 앞 숫자는 순서대로 작은 값입니다.
즉 정렬이 아스키값으로 정렬이 되기 때문에 저런 상황이 발생되는 겁니다.
그러면 이 정렬을 어떻게 제대로 하나?
먼저 정석적인 방법을 알아보겠습니다.
함수를 만들어서 2개의 인자를 받습니다.
그리고 2번째 인자가 1번째 인자보다 크면 -1, 같으면 0, 첫번째 인자가 크면 1이 반환되는 거죠
이렇게 함수를 만듭니다
그리고 sort 함수를 by_number 즉 방금 만든 정렬 함수에 보내고 그 인자로 @somelist 배열을 보내줍니다.
그리고 반환되는 값을 @secondsort에 받게 되죠
자 그럼 정렬이 되었네요!
근데 이렇게 하면 너무 힘들죠
귀찮기도 하고요
그래서 펄은 <=> 연산을 제공합니다
-1, 0, 1로 정렬하는 것을 즉 by_number 안에 썼던 내용을 <=>으로 간단하게 끝낼 수 있다는 겁니다.
위 처럼요
그러면 처음 작성했던 by_number와 기능이 똑같아 집니다!
정말 간단하죠?
그리고 아래처럼 사용도 가능해요
바로 sort { $a <=> $b } 를 넣어버리는 거죠
저렇게요!
저렇게 하면 신기하게도 정렬이 된답니다
정렬이 되었습니다
그리고 뭐 문자는 상관없는거 같더라고요
어차피 아스키로 비교하는거니까요
여기까지 펄 정렬에 대해서 자세히 알아봤습니다
'perl' 카테고리의 다른 글
펄(perl) 문자(문자열) 찾기, 문자열 자르기(index 함수, substr 함수) (0) | 2017.11.14 |
---|---|
펄(perl) continue(next, redo), break(last)문 (0) | 2017.11.13 |
펄(perl) 디렉토리 핸들링(디렉토리 변경, 파일 검색) (0) | 2017.11.13 |
펄 파일 입출력(perl fileio) 공부 (0) | 2017.10.31 |
펄 문자열 split(자르기), join(붙이기) (0) | 2017.10.30 |