다른 스택 프레임에서 PERL 변수를 어떻게 로컬 화하려면?
문제
일부 코드의 다른 장소에 다음을 효과적으로 작성하는 자동 생성 코드가 있습니다.
no warnings 'uninitialized';
local %ENV = %ENV;
local $/ = $/;
local @INC = @INC;
local %INC = %INC;
local $_ = $_;
local $| = $|;
local %SIG = %SIG;
use warnings 'uninitialized';
자동 생성 코드 일 때 일부는 코드가 "아름답다"는 것은 엄격히 필요하지 않다고 주장하지만,이를 서브 루틴으로 꺼내고 싶습니다. 그러나 그것은 해당 서브 루틴에서 이러한 변수를 현지화 할 것입니다. 호출 스택 프레임에서 이러한 변수를 현지화하는 방법이 있습니까?
업데이트: 비슷한 맥락에서는 더 높은 스택 프레임에서 Eval을 실행할 수있어서 좋을 것입니다. 파이썬에는 이미 이것을 가지고 있다고 생각합니다. Perl도 그랬다면 좋을 것입니다.
해결책
아마도 해당 지역 주민을 사용하는 코드를 폐쇄로 생성 할 수 있습니까? 그럼 당신은 할 수 있습니다
sub run_with_env {
my ($sub, @args) = @_;
no warnings 'uninitialized';
local %ENV = %ENV;
local $/ = $/;
local @INC = @INC;
local %INC = %INC;
local $_ = $_;
local $| = $|;
local %SIG = %SIG;
use warnings 'uninitialized';
$sub->(@args);
}
run_with_env(sub {
# do stuff here
});
run_with_env(sub {
# do different stuff here
});
다른 팁
Quantumpete가 왜 다운 투자를 받고 있는지 잘 모르겠습니다. 그는 이것에 옳은 것 같습니다. 당신은 말할 수 없습니다 local
호출 블록에서 변수를 초기화합니다. 기능은 특별하며 초기화/분해는 실행중인 블록에서만 작동합니다.
다음과 같은 실험 모듈이 있습니다 서브 :: 상향 조정 그리고 개발 :: 런 블록 "바보"를 시도 할 수 있습니다. caller()
서브 루틴의 경우 또는 더 높은 스택 프레임 (각각)에 대한 값의 '긴 점프 리턴'을 수행하지만 이들 중 어느 것도 영향을 미치지 않습니다. local
변수를 취급합니다 (나는 시도한 것입니다. :)
따라서 현재로서는 실제로 필요한 범위의 현지 선언과 함께 살아야 할 것 같습니다.
나는 Perl에 대해 크게 익숙하지 않으므로 실제로 가능하다면 용서하십시오. 그러나 일반적으로 스택 프레임에 로컬로 변수는 해당 스택 프레임 내에서만 사용할 수 있습니다. 더 높거나 낮은 곳에서 액세스 할 수 없습니다 (Hacky Pointer 산술을하지 않으면 성공할 수는 없습니다). 변수 선언의 큰 블록은 불행히도 당신이 함께 살아야 할 것입니다.
Quantumpete
Perldoc Perlguts의 말 :
The "Alias" module implements localization of the basic types within
the caller's scope. People who are interested in how to localize
things in the containing scope should take a look there too.
fwiw. 나는 이것이 얼마나 쉬운 지 볼 수있을만큼 Alias.pm을 면밀히 보지 않았습니다.
TCL에서는 사용할 수 있습니다 상향 조건. Perl은 모르겠습니다.
Perl이 있습니다 서브 :: 상향 조정