Friday, March 27, 2009

Symbolic reference 사용시 유의점


$x=10;
$sym='x';
$$sym=20;

print "$x\n";



위의 코드를 실행하면 $x 값으로 20이 출력되는 것을 확인할 수 있다.
Symbolic reference 가 적용되어 $sym = 'x'에 대해
$ { $sym } = $ { x} = $x 로 해석되어
$$sym=20 은 $x=20과 같이 해석되기 때문이다.

그럼 아래 코드는 어떨까?


my $x=10;
my $sym='x';
$$sym=20;

print "$x\n";


첫번째 코드의 결과와 같은 값이 출력될까?
정답은 NO!
이 코드는 그대로 $x에 대해 첫 라인의 정의대로 10이 출력된다.

해답은 'my' 과 symbolic reference의 동작 원리에 담겨있다.
my로 선언된 lexical 변수는 symbol table에 저장되지 않는다.
symbolic reference는 오직 lexical 변수를 제외한 package 변수에만 적용된다.


따라서 두번째 코드에서 변수 선언을 my 대신 local이나 our로 해주면 첫번째 코드와 같은 결과를 얻을 수 있다.


my $x=10;
$sym='x';
$$sym=20;

prnt "$x\n";


이 코드는 어떨까?
$$sym = ${x}= $x 로 해석되어 최종적으로 symbolic reference
의 적용을 받는 변수는 $x다. 그런데 $x가 my 로 선언되어 있어
symbol table에 저장되어 있지 않다.

따라서 $$sym=20 은 lexical 영역의 $x에 영향을 주지 못하고
이 코드는 결과적으로 $x=10 을 출력하게 된다.

그렇다면 $$sym=20 는 완전히 아무런 의미도 없는 코드일까?

그렇지 않다. $$sym 은 원래의 역할 그대로의 역할을 수행했다.
즉, symbol table에 존재하는 package global $x 에 20을
저장한 것이다.

이를 확인하기 위해서는 package 변수 $x를 출력해 보면 된다.


my $x=10;
$sym='x';
$$sym=20;

print "Lexical 변수 : $x \n"; # 10을 출력
print "Package 변수 : $::x \n "; # 20을 출력