Tips in Action‎ > ‎배열과 Hash‎ > ‎

배열의 배열

전종필

배열속에 배열을 집어넣으려면 어떻게 할까요?
Perl의 배열 자체는 C언어에서와 같은 다차원 배열을 만들수 없습니다. 따라서 리퍼런스(참조)를 이용해야 합니다.

@trees = qw( 소나무 참나무 상수리나무 오리나무 );
@fruit = qw( 사과 배 감 포도 );
@vegit = qw( 상추 시금치 토마토 );
@all = ( @trees, @fruit, @vegit ); # 아님. 그냥 1차원
$count_all = @all; # 11
@twodim = ( \@trees, \@fruit, \@vegit );
$count_twodim = @twodim; # 3
$grape = $twodim[1]->[3];
@all의 경우는 그냥 1차원의 배열이 되어서 원하는 효과를 거둘 수 없습니다. @twodim의 경우처럼 각 배열앞에 \(역슬래쉬)를 붙여야 각각이 리퍼런스가 되어 2차원 배열의 효과를 갖게 됩니다.
@twodim에서 2번째 요소인 @fruit 배열의 마지막 요소인 '포도'에 접근하려면 위와 같이

$twodim[1]->[3];
이라 합니다.
$twodim[1]은 배열 @fruit의 리퍼런스(\@fruit)이고, 배열의 리퍼런스를 이용하여 배열의 요소에 접근하려면 ->[ ]를 이용하기 때문입니다. 그러므로, 시금치를 콩나물로 바꾸려면

$twodim[2]->[1] = '콩나물';
과 같이 하면 됩니다. 위의 @twodim의 안에 있는 모든 것을 출력하려면 다음과 같이 합니다.

foreach my $array_ref ( @twodim ) {
	foreach my $var ( @$array_ref ) { # 배열의 리퍼런스 앞에 @를 붙이면 원래의 배열을 의미
		print "$var ";
	}
	print "\n"; # 한줄에 한 배열씩
}
또, 내부용 배열을 따로 선언하지 않고 @twodim을 한꺼번에 선언하려면,

@twodim = (
	[ qw( a b c ) ],	# 이렇게 qw//를 써도 되고
	[ 'x', 'y', 'z' ],	# 이렇게 해도 됩니다.
	[ qw( 1 3 5 ) ]
};
과 같이 각 내부배열에 해당하는 목록을 [ ]로 감싸면 됩니다. 이와 같이 배열 이름을 주지 않고 [와 ]로 감싼 배열을 이름없는 배열(anonymous array)이라고 합니다.
3차원, 4차원의 배열은 어떻게 할까요 ? 같은 원리를 이용하면 됩니다. 직접 한 번 해 보시길... 
Comments