[첫화면으로]Perl/Perlfaq4-List-and-Array

마지막으로 [b]

1. 리스트와 배열의 차이점은? (What is the difference between a list and an array?)

리스트는 스칼라들을 모아놓고 변경 불가능하게 고정시킨 것(fixed collection)이다. 배열은 스칼라들의 모음을 담을 수 있는 변수인데 이 모음은 변경할 수 있다(variable collection).

배열의 내용물은 리스트 연산자에 피연산자로 제공될 수 있고, 따라서 리스트 연산자들은 배열에도 동작한다:
     # 슬라이스
    ( 'dog', 'cat', 'bird' )[2,3];
    @animals[2,3];

    # 순회
    foreach ( qw( dog cat bird ) ) { ... }
    foreach ( @animals ) { ... }

    my @three = grep { length == 3 } qw( dog cat bird );
    my @three = grep { length == 3 } @animals;

    # 인자 리스트로 전달
    wash_animals( qw( dog cat bird ) );
    wash_animals( @animals );

배열 연산자들은 스칼라를 변경하거나, 재배열하거나, 추가하거나 제거하며, 오직 배열에만 동작한다. 배열 연산자에는 shift, unshift, push, pop, splice가 포함된다.

배열은 또한 길이를 변경할 수 있다:

    $#animals = 1; # 처음 두 원소만 남기고 끊어버림
    $#animals = 10000; # 10,001 개의 원소가 있는 배열로 늘림

배열의 원소는 변경할 수 있다. 그러나 리스트의 원소는 변경할 수 없다.
    $animals[0] = 'Rottweiler';
    qw( dog cat bird )[0] = 'Rottweiler'; # 신택스 에러!

    foreach ( @animals ) {
        s/^d/fr/; # 잘 동작한다
    }
    foreach ( qw( dog cat bird ) ) {
        s/^d/fr/; # 에러! 읽기 전용인 값을 변경하려 함
    }

만약 리스트의 원소가 어떤 변수라면 리스트의 원소를 변경할 수 있는 것처럼 보인다. 그러나 이 경우는 리스트의 원소를 변경하는 게 아니라 그 리스트 원소가 가리키는(refer to) 대상을 변경하는 것이다. 리스트 원소 자체는 변하지 않으며 여전히 같은 변수이다.

문맥에도 주의를 해야 한다. 배열을 스칼라에 할당하여 배열의 원소의 갯수를 얻어낼 수 있다:
    my $count = @animals;  # 배열에 대해서만 동작함

동일한 작업을 리스트를 대상으로 수행할 경우, 사뭇 다른 결과를 얻는다. 마치 우변에 리스트가 있는 것처럼 보이지만, Perl은 실제로는 컴마로 구분된 다수의 스칼라들로 간주한다:
    my $scalar = ( 'dog', 'cat', 'bird' );  # $scalar의 값은 'bird'가 된다.

스칼라 변수에 할당하려 하기 때문에, 우변이 스칼라 문맥이 된다. 스칼라 문맥에서 컴마 연산자(그렇다, 컴마도 연산자다!)는 자신의 좌측 피연산자를 평가하고, 결과는 내던져버리고, 우측 피연산자를 평가한 후 그 결과를 반환한다. 요컨데, 저 리스트 같이 생긴 우변은 가장 우측에 있는 값을 $scalar에 할당하게 된다. 많은 사람들이 이 부분을 혼동하곤 하는데, 리스트 닮은 우변을 만들 때 마지막 원소가 원소의 갯수와 동일한 값인 형태로 골랐기 때문이다:
    my $scalar = ( 1, 2, 3 );  # $scalar의 값은 "우연히" 3이 된다.

2. 참고

/배열 - 리스트와 배열의 차이에 관한 다른 글들이 소개되어 있음.

3. Comments

이름:  
Homepage:
내용:
 

컴퓨터분류 Perl /Perlfaq

마지막 편집일: 2012-11-9 10:05 pm (변경사항 [d])
1686 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기