Perl에는 다른 언어에서 구현된 것처럼 다차원 배열을 위한 내장 구문이 없습니다. 대신 배열의 배열을 사용하여, 최상위 요소가 다른 배열에 대한 참조입니다. 이러한 구성은 테이블, 행렬 및 이차원 이상으로 중첩된 데이터 구조를 유연하게 모델링할 수 있게 합니다.
Perl은 원래 텍스트 처리 및 간단한 구조 작업을 위해 개발되었지만, Perl 5부터 참조가 등장하면서 개발자들은 복잡한 중첩 구조, 즉 배열의 배열(array of arrays)이나 해시 배열을 구축할 수 있는 기회를 얻었습니다.
신규 사용자들이 가장 오해하는 점은: 이차원 배열을 간단한 방법으로 생성하려고 하는 것입니다. 예를 들어, @matrix = ( (1,2), (3,4) )라고 선언하는 것입니다. 이러한 접근 방식은 원하는 결과를 주지 않습니다. 왜냐하면 요소가 스칼라 값으로 언팩되고 중첩 구조로 들어가지 않기 때문입니다. 또한 배열 복사 시에도 자주 오류가 발생하여, 얕은 복사는 예상치 못한 부작용을 초래합니다.
Perl에서 다차원 배열은 배열에 대한 참조를 통해 구축됩니다. 올바른 초기화 방법은 다음과 같습니다:
my @matrix; for my $i (0..2) { for my $j (0..2) { $matrix[$i][$j] = $i * $j; } } # 요소 접근: $matrix[1][2]
또는 익명 참조를 통해:
my $matrix = [ [1,2,3], [4,5,6], [7,8,9] ]; print $matrix->[1][2]; # 6
주요 특징:
다른 언어처럼 단순히 괄호 안에 괄호를 선언하여 다차원 배열을 생성할 수 있습니까?
아니요. 이 경우 Perl은 요소를 일반 목록처럼 언팩합니다. 참조를 사용하는 것만이 올바릅니다.
잘못된 코드 예:
my @matrix = ((1,2,3),(4,5,6),(7,8,9)); # 요소들이 일렬로 나열됨 print $matrix[3]; # 4, [4,5,6]이 아닌 — 잘못된 작동
올바른 방법:
my @matrix = ( [1,2,3], [4,5,6], [7,8,9] ); print $matrix[1][2]; # 6
단순 할당으로 배열의 배열을 복사하면 무슨 일이 발생하나요?
상위 레벨만 복사되며, 중첩 배열은 동일한 메모리 영역을 참조합니다.
예:
my @a = ( [1,2], [3,4] ); my @b = @a; $a[0][0] = 99; print $b[0][0]; # 99, 1을 기대했지만 — 얕은 복사!
Perl의 내장 기능으로 "깊이" 있는 복사를 할 수 있습니까?
아니요, Perl은 중첩 구조를 위한 표준 깊은 복사 연산자를 제공하지 않습니다. Storable 모듈이나 재귀 함수를 사용해야 합니다.
Storable을 사용하는 예:
use Storable 'dclone'; my $deepcopy = dclone(\@matrix);
개발자가 단순 배열 선언으로 이차원 배열을 생성하고 할당으로 복사합니다:
my @m1 = ([1,2],[3,4]);
my @m2 = @m1;
$m1[0][0] = 77;
print $m2[0][0];
장점:
단점:
깊은 복사를 위한 Storable 모듈 사용:
use Storable 'dclone'; my @m1 = ([1,2],[3,4]); my $m2 = dclone(\@m1); $m1[0][0] = 77; print $m2->[0][0]; # 1
장점:
단점: