정렬(sort)

sort 함수는 배열을 ASCII 순으로 정렬하여 반환합니다.

@array = ( 'daemon', 'cat', 'tail', 'banana', 'camel' );
@sarray = sort @array;
print "@sarray\n"; # 출력된 내용은 'banana camel cat daemon tail' 입니다.

@narray = ( 342, 256, 2, 29, 38, 4, 12 );
@nsarray = sort @narray;
print "@nsarray\n"; # 출력된 내용은 '12 2 256 29 342 38 4' 입니다.
숫자들의 배열 ( 342, 256, 2, 29, 38, 4, 12 )을 정렬한 것의 순서가 좀 이상하다고 느끼신다면, 다시한번 생각해 보십시오. 정렬의 기준은 'ASCII 순'입니다. 따라서 256이 29보다, 342가 38보다 앞에 나오는 것입니다. 만일 이를 수의 크기 순으로 정렬하고 싶다면 그런 요구사항을 sort 함수가 알게 해 주어야 합니다. 그 방법은 다음과 같습니다.
@narray = ( 342, 256, 2, 29, 38, 4, 12 );
@nsarray = sort { $a <=> $b } @narray;
print "@nsarray\n"; # 출력된 내용은 '2 4 12 29 38 256 342' 입니다.
이제 좀 마음이 편안해지시나요?
여기서 변수 $a, $b는 배열 @narray의 각 요소가 $a, $b에 각각 대입되어지도록 합니다. 만일 큰 수가 앞에 나오도록 하려면{ $a <=> $b } 대신 { $b <=> $a }로 $a와 $b의 순서만 바꾸면 됩니다. 조금 더 원하는 방식대로 정렬하려 한다면, { } 사이에 다른 것을 넣을 수도 있습니다. 다음 예제는 한 줄에 여러개의 필드를 갖는 간단한 데이터를 특정 필드끼리 비교하여 정렬하는 예제입니다. 이 예제에서는 { } 사이에 서브루틴을 사용합니다.
$text=<<EOT;
index.html 354
welcome.html 13
sitemap.html 27
product.html 297
service.html 120
board.cgi 75
EOT

chomp $text; # 맨 끝의 \n을 없애 줍시다. 편의상...
@array = split /\n/, $text;
@sarray = sort { &csort($b,$a) } @array; # 카운터가 많은 순으로 비교해 봅시다.
print join( "\n", @sarray, '' );

sub csort {
	my( $ta, $tb ) = @_;
	my( $pa, $ca ) = split / /, $ta;
	my( $pb, $cb ) = split / /, $tb;
	$ca <=> $cb; # 카운터 값을 비교한 값을 반환합니다.
}
출력된 내용은 다음과 같습니다.
index.html   354
product.html 297
service.html 120
board.cgi    75
sitemap.html 27
welcome.html 13
이 정도면 sort에 대해서는 대략 설명이 되었습니다.
이전 | 목록 | 다음
Comments