문제의 역사:
Perl에서는 변수를 my(렉시컬 가시성)와 local(동적 임시 재지정) 연산자를 통해 범위를 제한할 수 있습니다. local은 전역 변수 및 특별한 핸들(예: $_, $/, $@, %ENV)을 재정의하는 데 널리 사용됩니다.
문제:
주요 문제는 동적 범위와 렉시컬 범위 간의 혼동입니다. local은 새로운 변수를 생성하지 않고, 블록 실행 중에 전역(또는 패키지) 변수의 값을 임시로 대체합니다. 이는 특히 $/ (줄 구분자), $_ (디폴트 변수), $^W (경고 플래그), %ENV, STDIN/STDOUT과 같은 변수를 재지정할 때 매우 중요합니다.
해결책:
코드 예시:
our $Global = "Hello!"; sub change1 { my $Global = "Bye!"; print "$Global "; } sub change2 { local $Global = "Bye!"; print "$Global "; } print "$Global "; # Hello! change1(); # Bye! print "$Global "; # Hello! change2(); # Bye! print "$Global "; # Hello!
주요 특징:
local을 my로 선언된 렉시컬 변수에 적용할 수 있습니까?
아니요, local은 패키지 전역 변수에만 작동합니다. my 객체에 대해서는 효과가 없습니다.
특별한 핸들, 예를 들어 STDIN에 local을 적용하면 어떻게 됩니까?
local을 통해 STDIN/STDOUT/stdin을 임시로 재지정할 수 있습니다. 예를 들어, 서브루틴 내에서 전역 효과 없이 입력/출력 스트림을 바꾸기 위해 사용할 수 있습니다. 블록을 벗어나면 핸들이 복원됩니다.
재귀 함수 호출 시 local과 my 간의 중요한 차이점은 무엇입니까?
local은 "push/pop" 값 스택을 제공합니다. 각 호출은 패키지의 값을 임시로 재정의하고, 중첩 호출은 이 재정의된 값을 받습니다. my는 블록 내에서만 단일 렉시컬 값을 제공하며 내부로 상속되지 않습니다.
테스트에서 %ENV를 변경하기 위해 local을 사용하는 경우 블록을 벗어난 후에 다른 스레드에서 예기치 않은 부작용이 발생합니다. 이는 코드가 다중 스레드이고 local이 잘못 사용되었기 때문입니다.
장점:
단점:
특별한 변수($/, $@, $SIG)를 필요한 블록 호출 시간 동안만 변경하고, 이후에 변경 사항이 올바르게 롤백됩니다.
장점:
단점: