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

마지막으로 [b]

변경사항 (가장 최근의 "다른 사용자에 의한 수정"부터) (일반적인 수정, 소소한 수정)

-1,29 +1,75
== # 리스트와 배열의 차이점은? (What is the difference between a list and an array?) ==
* 원문: http://faq.perl.org/perlfaq4.html#What_is_the_differen
* 원문: <a href="http://learn.perl.org/faq/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array-">http://learn.perl.org/faq/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array-</a>
배열은 그 길이를 변경할 수 있고, 리스트는 그럴 수 없다. 배열은 사용자가 push 또는 pop을 할 수 있는 대상이고, 리스트는 값들의 집합이다. 어떤 사람들은 리스트는 값이고 배열은 변수라고 구분한다. 서브루틴은 리스트를 인자로 받고 리스트를 반환하며, 당신은 뭔가를 리스트에 넣고, 배열을 초기화할 때 리스트를 사용하고, 리스트를 순회하기 위하여 "foreach()"를 사용한다. "@"로 시작하는 변수는 배열이다, 익명 배열들은 배열이다, 스칼라 문맥 안의 배열은 그 배열의 원소의 갯수로 동작한다, 서브루틴은 @_ 배열을 통해 인자에 접근한다, push/pop/shift는 배열에만 사용가능하다.
리스트는 스칼라들을 모아놓고 변경 불가능하게 고정시킨 것(fixed collection)이다. 배열은 스칼라들의 모음을 담을 수 있는 변수인데 이 모음은 변경할 수 있다(variable collection).
참고로, 스칼라 문맥 안의 리스트란 것은 없다. 다음과 같은 경우
배열의 내용물은 리스트 연산자에 피연산자로 제공될 수 있고, 따라서 리스트 연산자들은 배열에도 동작한다:
{{{#!vim perl
     # 슬라이스
    ( 'dog', 'cat', 'bird' )[2,3];
    @animals[2,3];
<code>$scalar = (2, 5, 7, 9);</code>
    # 순회
    foreach ( qw( dog cat bird ) ) { ... }
    foreach ( @animals ) { ... }
당신은 스칼라 문맥 안에서 컴마 연산자를 사용하고 있는 것이고, 결국 스칼라 컴마 연산자를 사용하게 된다. 여기에 리스트란 건 없었다! 이는 결과적으로 마지막 값인 9가 반환되게 한다.
    my @three = grep { length == 3 } qw( dog cat bird );
    my @three = grep { length == 3 } @animals;
<div class="comments">
    # 인자 리스트로 전달
    wash_animals( qw( dog cat bird ) );
    wash_animals( @animals );
}}}
배열 연산자들은 스칼라를 변경하거나, 재배열하거나, 추가하거나 제거하며, 오직 배열에만 동작한다. 배열 연산자에는 <code>shift</code>, <code>unshift</code>, <code>push</code>, <code>pop</code>, <code>splice</code>가 포함된다.
배열은 또한 길이를 변경할 수 있다:
{{{#!vim perl
    $#animals = 1; # 처음 두 원소만 남기고 끊어버림
    $#animals = 10000; # 10,001 개의 원소가 있는 배열로 늘림
}}}
배열의 원소는 변경할 수 있다. 그러나 리스트의 원소는 변경할 수 없다.
{{{#!vim perl
    $animals[0] = 'Rottweiler';
    qw( dog cat bird )[0] = 'Rottweiler'; # 신택스 에러!
    foreach ( @animals ) {
        s/^d/fr/; # 잘 동작한다
    }
    foreach ( qw( dog cat bird ) ) {
        s/^d/fr/; # 에러! 읽기 전용인 값을 변경하려 함
    }
}}}
이건 참 선문답 같기도 하고... <mysign([[Raymundo]],2009-4-19 7:10 pm)>
만약 리스트의 원소가 어떤 변수라면 리스트의 원소를 변경할 수 있는 것처럼 보인다. 그러나 이 경우는 리스트의 원소를 변경하는 게 아니라 그 리스트 원소가 가리키는(refer to) 대상을 변경하는 것이다. 리스트 원소 자체는 변하지 않으며 여전히 같은 변수이다.
몰라... <mysign([[Zehn02]],2009-4-19 8:30 pm)>
문맥에도 주의를 해야 한다. 배열을 스칼라에 할당하여 배열의 원소의 갯수를 얻어낼 수 있다:
{{{#!vim perl
    my $count = @animals;  # 배열에 대해서만 동작함
}}}
: 우리 집에는 악플러가 삽니다... <mysign([[Raymundo]],2009-4-19 8:30 pm)>
동일한 작업을 리스트를 대상으로 수행할 경우, 사뭇 다른 결과를 얻는다. 마치 우변에 리스트가 있는 것처럼 보이지만, Perl은 실제로는 컴마로 구분된 다수의 스칼라들로 간주한다:
{{{#!vim perl
    my $scalar = ( 'dog', 'cat', 'bird' );  # $scalar의 값은 'bird'가 된다.
}}}
:: 몰라서 모른다고 한게 왜 악플이에요.. <mysign([[Zehn02]],2009-4-19 8:30 pm)>
스칼라 변수에 할당하려 하기 때문에, 우변이 스칼라 문맥이 된다. 스칼라 문맥에서 컴마 연산자(그렇다, 컴마도 연산자다!)는 자신의 좌측 피연산자를 평가하고, 결과는 내던져버리고, 우측 피연산자를 평가한 후 그 결과를 반환한다. 요컨데, 저 리스트 같이 생긴 우변은 가장 우측에 있는 값을 <code>$scalar</code>에 할당하게 된다. 많은 사람들이 이 부분을 혼동하곤 하는데, 리스트 닮은 우변을 만들 때 마지막 원소가 원소의 갯수와 동일한 값인 형태로 골랐기 때문이다:
{{{#!vim perl
    my $scalar = ( 1, 2, 3 );  # $scalar의 값은 "우연히" 3이 된다.
}}}
:: 우리집에는 **박 정부같은 인간이 삽니다. <mysign([[Zehn02]],2009-4-19 8:31 pm)>
== # 참고 ==
[[/배열]] - 리스트와 배열의 차이에 관한 다른 글들이 소개되어 있음.
== # Comments ==
<div class="comments">
<longcomments(100)>
----
<trackbackreceived>
</div>
----
[[컴퓨터분류]] [[Perl]] [[/Perlfaq]]


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])
1826 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기