관리 메뉴

(코딩캣) = "코딩"하는 고양이;

[옛 강좌] 40. Advanced_Perl - my() & local() 함수 본문

Common Gateway Interface/Perl

[옛 강좌] 40. Advanced_Perl - my() & local() 함수

컴파일러님, 이 코드는 고양이발로 작성되었습니다. 코딩집사 2015. 4. 29. 13:31

 이 게시물은 지금은 폐쇄되어 접속되지 않는 Kim Young Soo(http://hours.interpia98.net/~unisoo/)님의 웹 사이트에 2001년경 게시된 내용을 바탕으로 오늘날 웹 환경에 맞게 내용을 덧붙였습니다.

Advanced_Perl - my() & local() 함수

Description

my 와 local의 차이점.

Author

이채광(w3master@myperl.pe.kr : http://www.myperl.pel.kr/)


훑어 보기

사람들이 my()와 local()에 대해서 대충은 알겠으나, 약간은 아리송한 부분이 있다기에 정리를 해 봅니다. 어느 정도 알고 있을테니까 헷갈리겠지요? 우리가 일상 사용하는 변수는 패키지 변수(package variable)입니다. local()은 이 패키지 변수에만 적용할 수 있습니다. my()는 변수를 비 패키지 변수(non package variable)로 만듭니다. 자! 우선 예제를 보고 좀 더 구체적으로 살펴 보죠.

#!/usr/bin/perl -w 

my $my = 'outer';
$local = 'global';
{
	local ($local) = 'local';
	my $my = 'inner';
	show_me();
}

sub show_me
{
	print "$local : $my\n";
}
				

 실행 결과 >

local : outer

 심볼 테이블(symbol table)에 대해서 구체적으로 몰라도 상관없습니다. 일단은 패키지의 변수명을 기록 보관해 놓는 표라고 생각합시다. 패키지는 서로 간의 교류에 심볼 테이블을 사용하므로 이곳에 등록되지 않은 변수는 다른 패키지와 교류가 없습니다. 즉 local 변수는 심볼 테이블에 기록이 되고, my 변수는 심볼 테이블에 기록이 안 됩니다.

local()

 심볼 테이블에 이미 등록이 되어 있는 변수에 대해서만 사용 가능합니다. 평범한 방법으로 정의한 $local은 심볼 테이블에 기록이 된 후 블록 속으로 들어가 local()가 적용되었습니다. local()이 적용되는 순간 원래의 변수값이 임시영역으로 물러가고 일시적으로 새로운 값이 들어 갑니다. 이는 local변수가 있는 블록 내에서만 그렇고 블록을 벗어나는 순간 임시영역에 있던 값이 다시 복귀됩니다. 새로운 변수가 생겨난 후 사라지는 것이 아닙니다. 그러므로 local()이 적용 되더라도 심볼 테이블에는 새로운 변수가 추가 되지 않습니다. local()에 의한 변수는 그것이 정의된 블록 내에서 호출한 함수에도 그대로 적용되므로 이에 유의해야 합니다. 위의 결과에서 확인할 수 있습니다.

 local()만의 사용 예

 첫 줄에 나오는 -w 스위치가 가끔은 잘 못 작동할 경우가 있습니다. 분명히 잘못 된 곳이 없는 데도 불평을 할 때가 있죠. 이런 경우에 -w 스위치를 삭제하는게 아니라, 어느 특정 부분에서만 잠시 꺼두는 방법이 좋습니다. 이 때 local()이 바로 적격입니다. my()로는 할 수 없죠?

#!/usr/bin/perl -w

# ..
# .. 
{
	local ($^W) = 0;
	# ..
	# ..
}

## here, $^W = 1
# ..
# .. 
					

my()

이는 선언과 함께 정의도 가능합니다. 그러면 심볼 테이블에 변수를 기록하지 않고, 스크래치 패드(scratchpad)에 기록을 하게 되죠. my()가 적용된 변수는, 적용된 블록내의 스크래치 패드에만 기록되어 블록내의 함수 호출시에는 적용되지 않습니다. 위의 예에서, show_me()의 블록 내에서는 $my가 기록되어 있지 않으므로 바깥쪽 블록의 스크래치 패드를 찾게 되어 위와 같은 결과가 나왔습니다. 스크래치 패드에 없는 경우에 펄은 바깥 쪽 블록의 스크래치 패드를 찾고, 만약 없으면 다음 바깥 쪽 블록의 스크래치 패드를 검색하게 됩니다. 즉, 바깥 쪽으로 계속해서 찾아 나갑니다.

local()과 my() 사용

 local 변수는 실제로는 전역 변수(global variable)이므로, 꼭 필요한 경우를 제외하고는 my()를 사용함이 좋습니다. my 변수가 좀 더 빠르고 안전하기 때문입니다.


이 문서는 Perl 패키지내의 pod2html를 이용하여 만들었습니다. - Kim Young Soo

최종 수정일 : 2000/03/02

0 Comments
댓글쓰기 폼