-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]] |