문제

일부 코드의 다른 장소에 다음을 효과적으로 작성하는 자동 생성 코드가 있습니다.

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이 있습니다 서브 :: 상향 조정

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top