배열

배열 에서 Perl

1개의 연습 문제

배열 소개

배열과 리스트는 스칼라의 순서 있는 모음을 담아요. 레퍼런스를 사용하는 경우(이건 별도의 개념에서 다뤄요)를 빼면, 배열과 리스트는 항상 평평해요. 즉, 다른 배열이나 리스트를 담을 수 없어요.

대부분의 경우 리스트는 괄호 ()로 둘러싸고, 원소는 쉼표 ,로 구분해요.

배열 변수는 보통 리스트를 대입해서 채워요. 예를 들어 my @names = ('Alice', 'Bob', 'Charlie');처럼요.

배열이나 리스트의 원소는 첨자로 인덱스를 지정해서 접근할 수 있어요. 예를 들어 ('Alice', 'Bob', 'Charlie')[1] # 'Bob'처럼요.

Perl의 인덱스는 0부터 시작해요. 음수 인덱스는 배열이나 리스트의 끝에서부터 세요. 예를 들어 ('Alice', 'Bob', 'Charlie')[-1] # 'Charlie'처럼요.

함수

배열과 리스트를 다루기 위해 구현된 함수가 아주 많은데, 그중 특히 유용한 것은 조건에 맞는 원소만 걸러낸 새 리스트를 만들어 주는 grep, 원소를 새로운 값의 리스트로 변환해 주는 map, 원소의 순서를 바꾼 새 리스트를 만들어 주는 sort예요.

배열을 조작하는 함수로는 끝에 원소를 추가하는 push, 마지막 원소를 제거하는 pop, 첫 번째 원소를 제거하는 shift, 앞에 원소를 추가하는 unshift, 그리고 더 복잡한 수정을 위한 splice가 있어요.

배열과 리스트를 for(each) 문으로 반복하는 것도 자주 만나게 될 거예요.

시길의 차이

배열의 원소에 접근할 때는 어떤 시길을 쓰느냐에 따라 결과가 달라져요. 변수 이름 끝에 있는 [] 첨자가 Perl에게 그 이름의 배열에 접근하고 있다는 것을 알려 줘요.

my @names = ('Alice', 'Bob', 'Charlie');

$names[0]; # 'Alice'      <- A scalar
@names[0]; # ('Alice')    <- A slice (with only one index, this probably isn't what you want. There will be a warning.)
%names[0]; # (0, 'Alice') <- A key/index + value slice

$names[1, 2]; # 'Charlie'                <- A scalar (via unsupported syntax for an ancient feature. Probably not what you want. There will be a warning.)
@names[1, 2]; # ('Bob', 'Charlie')       <- A slice
%names[1, 2]; # (1, 'Bob', 2, 'Charlie') <- A key/index + value slice

허용되기는 하지만, 가독성을 위해 서로 다른 타입의 변수가 같은 이름을 공유하지 않는 것이 좋아요.

배열과 리스트의 차이

배열과 리스트는 닮은 점이 많고 많은 곳에서 서로 바꿔 쓸 수 있지만, 같은 것은 아니에요. 리스트는 고정되어 있고 변경할 수 없는 스칼라의 모음이에요. 배열은 내용과 배열 자체의 크기를 바꿀 수 있는, 가변적인 스칼라의 모음이에요.

두 가지는 어떤 문맥에서는 동작이 달라요. 스칼라 문맥에서 사용한 배열은 배열의 크기를 알려 줘요. 스칼라 문맥에서 사용한 리스트는 리스트의 마지막 원소를 알려 주고, 나머지 내용이 void 문맥에서 사용된다는 경고가 몇 개 나올 수도 있어요.

my @names = ('Alice', 'Bob', 'Charlie');

scalar @names; # 3
scalar ('Alice', 'Bob', 'Charlie'); # 'Charlie' (and some warnings).

자세한 내용은 다음 FAQ를 참고해요: 리스트와 배열의 차이는 무엇인가요?

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

배열 배우기

연습이 잠겨 있어요

배열 개념을 연습하려면 연습 문제 10개를 더 잠금 해제해요