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;
배열의 원소는 변경할 수 있다. 그러나 리스트의 원소는 변경할 수 없다.
$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
에 할당하게 된다. 많은 사람들이 이 부분을 혼동하곤 하는데, 리스트 닮은 우변을 만들 때 마지막 원소가 원소의 갯수와 동일한 값인 형태로 골랐기 때문이다:
my $scalar = ( 1, 2, 3 );
/배열 - 리스트와 배열의 차이에 관한 다른 글들이 소개되어 있음.
3. Comments
컴퓨터분류 Perl /Perlfaq