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

해쉬의 해쉬

전종필

Tip: 배열의 배열과 같은 맥락의 팁입니다.
배열의 배열에서 보시는 것과 같은 방법으로 리퍼런스(참조)를 이용하여 해쉬의 해쉬를 만듭니다.

%classA = (
	name => '개나리반', howmany => 15, teacher => '펄아비', perform => 'GOOD'
);
%classB = (
	name => '민들레반', howmany => 17, teacher => '펄어미', perform => 'BEST'
);
%classC = (
	name => '쑥갓반',   howmany => 14, teacher => '펄맨', perform => 'OOPS'
);
위의 자료를 다시 해쉬에 넣을 예정입니다. 배열의 리퍼런스가 \@array인 것처럼, 해쉬의 리퍼런스도 \%hash입니다. 따라서,

%everyClass = ( a => \%classA, b => \%classB, c => \%classC );
와 같이 해쉬의 해쉬를 만듭니다.
위 과정을 하나로 처리하려면 이름없는 배열을 []로 만드는 것과 유사하게 {}를 사용하여 이름없는 해쉬(anonymous hash)를 만듭니다. (아마 일관적인 규칙을 눈치채셨을 것입니다.)

%everyClass = (
	a => {
		name => '개나리반', howmany => 15, teacher => '펄아비', perform => 'GOOD'
	},
	b => {
		name => '민들레반', howmany => 17, teacher => '펄어미', perform => 'BEST'
	},
	c => {
		name => '쑥갓반',   howmany => 14, teacher => '펄맨', perform => 'OOPS'
	}
);
해쉬 리퍼런스를 해쉬로 사용하려면 앞에 %를 붙입니다. 이 때, %가 적용될 리퍼런스전체를 { }로 감싸주어 우선 순위에 대한 문제를 해결합니다. 개별 요소에 대한 접근은 ->{ }를 사용합니다.

print "$everyClass{a}->{teacher}\n"; # 펄아비
print "$everyClass{c}->{howmany}\n"; # 14

foreach my $class ( sort keys %everyClass ) {
	foreach my $key ( sort keys %{$everyClass{$class}} ) { # {}로 리퍼런스를 감싼 모습
		print "  $key: $everyClass{$class}->{$key}\n"; # 개별 요소 접근
	}
	print "\n";
}
(위에서 잠시 언급한 역참조와 관련한 우선순위 문제에 대해서는 또 다른 Tip으로 설명하겠습니다.) 
Comments