배열의 배열, 해시의 해시 및 기타 복합 데이터 구조는 Perl에서 참조를 사용하여 구성됩니다. 이러한 접근 방식은 계층적/분기 구조를 쉽게 생성할 수 있지만, 기본적으로 내용이 아닌 참조를 기억하므로 접근, 복사 및 수정 시 주의가 필요합니다.
원래 Perl은 중첩 없는 평면 배열과 해시만 지원했습니다. 이후 참조 지원이 추가되어 배열의 배열, 해시의 해시, "트리", "그래프" 구조 등 다양한 조합을 구축할 수 있게 되었습니다.
복합 구조를 다룰 때는 접근, 기록 및 복사 작업이 참조와 작동한다는 것을 기억해야 합니다. 종종 요소와 요소에 대한 참조 간의 혼란으로 인해 오류가 발생합니다. 이는 프로그램의 여러 부분에서 참조가 동시에 사용될 경우, 한 곳에서 데이터가 변경되면 전체 구조에 반영되는 등 여러 버그를 초래합니다.
배열의 배열을 생성하기 위해:
my @matrix; for my $i (0..2) { for my $j (0..2) { $matrix[$i][$j] = $i * $j; } } print $matrix[1][2]; # 2
해시의 해시를 위해:
my %data; $data{'user1'}{'name'} = 'Alex'; $data{'user1'}{'age'} = 20;
혼합 구조:
my %complex = ( 'list' => [1, 2, 3], 'map' => { foo => 'bar' }, );
구조 복사를 위해 배열을 다른 배열에 할당하면 무엇이 발생합니까?
이런 할당은 중첩 구조를 복사하지 않고, 단지 그에 대한 참조만 복사합니다(즉, "얕은 복사"가 발생합니다).
my @a = ([1,2], [3,4]); my @b = @a; $a[0][0] = 99; printf "$b[0][0] "; # 99가 출력됩니다. 왜냐하면 @b는 @a와 같은 배열을 가리키는 참조를 포함하기 때문입니다.
$array[$i]와 $array->[$i]로 요소에 접근하는 것은 어떻게 다릅니까?
첫 번째 경우는 배열이 있을 때 작동하고, 두 번째는 배열을 참조하는 스칼라가 있을 때 작동합니다. 중첩 구조에 대해 가장 일반적인 구문은 화살표($foo->[0])입니다.
표준 Perl에서 dclone을 사용하여 구조의 복사본을 만들 수 없는 이유는 무엇입니까?
dclone은 Perl 기본 배포판에 포함되어 있지 않기 때문입니다. 복합 구조의 깊은 복사를 위해서는 Storable 모듈과 dclone 함수를 사용합니다:
use Storable 'dclone'; my $deep_copy = dclone(\%complex);
프로젝트에서 일반 할당(@copy = @org)을 통해 배열의 배열을 복사하고, 일련의 변경 후에 원본 데이터가 복사본과 함께 변경된 것을 발견합니다.
장점:
단점:
Storable 모듈과 dclone 함수를 사용하여 배열 및 해시를 복사하고, 코드에 이를 명확히 문서화하고 참조와 비참조를 분명히 구분합니다.
장점:
단점: