Perl 기본 배열 정렬 방법 소개

3784 단어 Perl배열 정렬
본고는 Perl로 문자열이나 숫자 그룹을 정렬하는 방법을 배웁니다.
Perl에sort라는 내장 함수가 있습니다. 의심할 여지없이 하나의 그룹을 정렬할 수 있습니다.가장 간단한 형식은 정렬된 요소로 구성된 그룹을 되돌려주는 그룹을 전달하는 것입니다. @sorted = sort @original.
ASCII 코드 기반 정렬

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
 
use Data::Dumper qw(Dumper);
 
my @words = qw(foo bar zorg moo);
 
say Dumper \@words;
 
my @sorted_words = sort @words;
 
say Dumper \@sorted_words;
위의 예는 인쇄될 것이다

$VAR1 = [
        'foo',
        'bar',
        'zorg',
        'moo'
      ];
 
$VAR1 = [
        'bar',
        'foo',
        'moo',
        'zorg'
      ];
첫 번째 출력은 정렬 전의 그룹을 표시하고, 두 번째는 정렬 후의 것이다.
이것은 가장 간단한 상황이지만, 아마도 네가 원하는 것은 아닐 것이다.예를 들어 만약 어떤 단어들이 대문자로 시작한다면 어떻게 합니까?

my @words = qw(foo bar Zorg moo);
@sorted_names의 결과는 다음과 같습니다.

$VAR1 = [
        'Zorg',
        'bar',
        'foo',
        'moo'
      ];
대문자로 시작하는 단어가 1위에 올랐다는 것을 알게 될 것이다.이것은sort가 기본적으로 ASCII 코드에 따라 정렬하기 때문에 모든 대문자가 소문자 앞에 배열되어 있기 때문입니다.
비교 함수
Perl의sort의 작업 방식은 이렇습니다. 원시 수조의 두 원소를 두루 훑어봅니다.매번 왼쪽 값을 변수 $a에 넣고 오른쪽 값을 변수 $b에 넣는다.그리고 비교 함수를 호출합니다.만약 $a의 내용이 왼쪽에 있어야 한다면'비교 함수'는 1을 되돌려줍니다.만약 $b가 왼쪽에 있어야 한다면 -1, 둘이 같으면 0을 되돌려줍니다.
보통 비교 함수를 볼 수 없습니다. sort는 ASCII 코드에 따라 값을 비교합니다. 그러나 당신이 원한다면 현저하게 쓸 수 있습니다.

sort { $a cmp $b } @words;
이 코드는 블록을 사용하지 않은sort@words와 같은 효과를 낼 수 있습니다.
기본perl은 cmp를 비교 함수로 사용합니다.이것은 바로 cmp가 이 안에서 우리가 필요로 하는 일을 할 수 있기 때문이다.이것은 양쪽 문자열의 값을 비교합니다. 왼쪽 파라미터가 오른쪽 파라미터보다 작으면 1을 되돌려줍니다.왼쪽 매개 변수가 오른쪽 매개 변수보다 크면 -1로 돌아갑니다.같으면 0으로 돌아갑니다.
알파벳순으로 배열하다
문자열의 대소문자를 무시하고 정렬하고 싶다면, 일반적인 알파벳 순서라고 하면 다음 예와 같이 할 수 있다.

my @sorted_words = sort { lc($a) cmp lc($b) } @words;
여기서 비교하기 위해서, 우리는lc 함수를 호출하여 매개 변수의 소문자 버전을 되돌려줍니다.그리고 cmp는 이 소문자 버전을 비교하여 원시 문자열을 누가 먼저, 누가 뒤에 있는지 결정합니다.
결국

$VAR1 = [
        'bar',
        'foo',
        'moo',
        'Zorg'
      ];
Perl 쌍 수치 정렬
만약 수치 그룹이sort를 사용하여 기본 정렬을 한다면, 결과는 우리가 기대하는 것이 아닐 수도 있습니다.

my @numbers = (14, 3, 12, 2, 23);
my @sorted_numbers = sort @numbers;
say Dumper \@sorted_numbers;
$VAR1 = [
        12,
        14,
        2,
        23,
        3
      ];
곰곰이 생각해 보면, 이것은 결코 이상하지 않다.비교 함수가 12와 3을 보았을 때 문자열로 비교합니다.이것은 두 문자열의 첫 번째 문자인'1'과'3'를 비교한다는 것을 의미한다.ASCII 코드 테이블에서 "1"은 "3"앞에 있기 때문에 "12"문자열은 "3"문자열 앞에 있습니다.
Perl은 숫자에 따라 이 값을 정렬하고 싶다는 것을 신기하게 알아맞히지 못할 것이다.
비록 우리는 비교 함수를 써서 숫자에 따라 두 개의 값을 비교할 수 있다.그러나 여기서 우리는 <=>(우주선 조작부호라고도 부른다)을 사용하는데, 그것은 숫자에 따라 두 개의 매개 변수를 비교하고 1, -1 또는 0으로 되돌아간다.

my @sorted_numbers = sort { $a <=> $b } @numbers;
결과:

$VAR1 = [
        2,
        3,
        12,
        14,
        23
      ];

좋은 웹페이지 즐겨찾기