문제의 역사:
Perl은 초기부터 글로벌 변수와 로컬 변수를 모두 적극적으로 사용했습니다. 이후 my 키워드를 통해 렉시컬 변수(lexical variables)가 등장했습니다. 이는 개발자들에게 변수의 범위를 제어하고 이름 충돌을 방지하기 위한 편리한 도구를 제공했습니다.
문제점:
글로벌(package variables) 및 렉시컬 변수 간의 혼동, local과 my의 잘못된 사용, 코드 실행 중 글로벌 값을 임시로 변경하는 등으로 인해 종종 오류가 발생합니다. 대규모 프로젝트에서는 범위 관리에 소홀할 경우 추적하기 힘든 오류가 발생할 수 있습니다.
해결책:
변수를 블록 내에서 렉시컬 범위로 선언할 때는 my를 사용하고, 글로벌 변수는 필요할 때만 사용하세요. 글로벌 변수의 값을 일시적으로 변경할 때는 local을 사용하며, 이는 블록 종료 시까지 원래 값을 저장합니다. 패키지 변수를 위해서는 our을 사용합니다. 이러한 차이를 올바르게 이해하면 부작용을 피할 수 있습니다.
코드 예:
our $global = 10; sub demo { my $lexical = 20; local $global = 99; # 글로벌을 임시로 변경 print "demo 내부: $global, $lexical "; } demo(); print "demo 외부: $global ";
주요 특징:
my는 현재 블록 내에서만 보이는 변수를 생성합니다.local은 글로벌 변수를 일시적으로 변경합니다.our은 현재 파일이 아닌 곳에서 사용할 수 있는 패키지 변수를 선언합니다.my로 선언된 변수가 현재 블록 외부에서 접근 가능합니까?
아니요. my로 선언된 렉시컬 변수는 생성된 블록 내에서만 보이며, 그 외부에서는 존재하지 않습니다.
local과 our의 차이는 무엇입니까?
local은 블록 동안 글로벌 변수의 값을 일시적으로 변경하고, our은 패키지 전체에서 보이는 변수를 선언하며, 값을 복사하지 않습니다.
코드 예:
our $var = 1; # 패키지 글로벌 변수 sub test { local $var = 3; # $var를 3으로 임시 변경 print $var; }
eval 내에서 my를 사용할 수 있어, 변수가 eval 외부에서 보이게 할 수 있습니까?
아니요. eval 내에서 선언된 my 변수의 범위는 오직 해당 eval 블록으로 제한됩니다.
my와 local 간 혼동, 이러한 키워드의 작용에 대한 오해부정적인 사례
대규모 Perl 프로젝트에서 글로벌 변수를 명시적인 범위 지정 없이(즉, my 및 our 없이) 곳곳에서 사용했습니다. 한 번은 새로운 개발자가 모듈에서 이러한 변수를 실수로 재정의하여 production에서 예측할 수 없는 결과를 초래했습니다.
장점:
단점:
긍정적인 사례
새로운 프로젝트에서 모든 변수는 함수 및 블록 내에서 my로 선언되었으며, 글로벌 변수는 필요할 때만 our로 선언하고, 명확한 문서화를 통해 관리되었습니다.
장점:
단점: