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

리퍼런스의 역참조와 우선순위

전종필

리퍼런스(참조형)에 대해선 아마 알고 계실겁니다. 모르시면 배열의 배열, 해쉬의 해쉬, 배열의 해쉬, 해쉬의 배열를 참조하시기 바랍니다.
아래 두개의 변수가 있습니다. 하나는 해쉬의 리퍼런스로서 스칼라 변수($aref)이고, 또 하나는 해쉬(%aref)입니다.

$aref = { 'a' => "Hey\n" };
%aref = ( 'a' => \"Man\n" );
print $$aref{a}; print ${$aref{a}}
그렇다면, $$aref{a}를 출력하면 'Hey'가 출력될까요 ? 'Man'이 출력될까요 ?

print $$aref{a}; # Hey 출력
print ${$aref{a}}; # Man 출력
$$aref{a}를 출력하면 'Hey'가 출력됩니다.
이유는 역참조(dereference)를 행하면 연산자 $(맨 앞의 $)는 인접한 항(Term)에 적용되기 때문입니다. 결국, $$aref{a}는 해쉬 %$aref에서 키가 'a'인 요소로서, 좀 더 명확히 하려면 ${$aref}{a}입니다. (사실, 사용할 때는 보통 $aref->{a}라고 합니다.)
그렇다면 Man을 출력하기 위해서 취한 조치는 무엇인가요?(말투가 좀 이상 ^^)
{}를 $aref{a} 주변에 씌우고 그 앞에 $를 붙였습니다. $aref{a}는 해쉬 %aref에서 키가 'a'인 요소로서, 문자열 "Man\n"의 참조형(앞에 \를 붙인)입니다. 따라서 이 것 전체인 $aref{a}에 대한 역참조를 하면 "Man\n"이 되는 것입니다.

사실, 역참조를 다중으로 하다보면 많이 헷갈립니다. 어떤 것에 우선순위가 걸릴지 확실하지 않다면, 다음처럼 {}로 싸서 우선순위를 명시하면 됩니다.


${$myref->{a}}->{b}; # ????
위 문항은 $myref->{a}가 Hash의 리퍼런스의 리퍼런스인 경우이겠군요. (헷갈리겠지만 잘 들여다 보시길...) 
Comments