2013-11-14 3 views
4

나는 Perl의 AUTOLOAD 서브 루틴을 사용하는 레거시 코드에 빠져있다. 맵핑되지 않은 모든/정의되지 않은 서브 루틴은 AUTOLOAD에 의해 처리됩니다. 어휘 환경에서 AUTOLOAD 처리를 비활성화 할 수 있습니까?Perl의 AUTOLOAD 서브 루틴을 어휘 없게 끄려면?

이 솔루션은 작동하지 않습니다

# ENTER CODE HERE 
{ 
    # Turn off AUTOLOAD for this block. 
    local *AUTOLOAD; 
    undef *AUTOLOAD; 

    # ENTER CODE HERE 
} 
# ENTER CODE HERE 
+0

하는'추가 할 경우 "nonexistant 방법 $의 AUTOLOAD에 전화"죽을 청소기 수 있습니다 $ AUTOLOAD_DISABLED;'를 귀하의'AUTOLOAD'에 보냅니다. (그런 다음'local $ AUTOLOAD_DISABLED = 1;'.) – ikegami

+0

결함 스크립트 내에 빠진 모든 스크립트가 필요하다는 경고를 추가했습니다. 그래서 지금 그것은 작동합니다 :) – burnersk

답변

6

AUTOLOAD 문제의 패키지에 따라 다릅니다. 그래서 패키지 방법을 재정의 :

#!/usr/bin/perl 
# 

{ 
    package autoloading; 

    sub AUTOLOAD { 
     print "YEAH ${AUTOLOAD}!\n"; 
    } 

    sub new { 
     return bless {}, $_[0]; 
    } 
} 

$obj = new autoloading(); 

$obj->foo(); 

*{autoloading::AUTOLOAD} = sub {}; 

$obj->bar(); 

는 생산 출력 :

YEAH autoloading::foo! 

합니다 ($obj->bar() 호출에 대한 라인 없음)

+0

패키지없이 이것을 시도하고 작동하지 않습니다. 그래서'main ::'을 포함한 모든 패키지에 대해 이것을 설정했습니다. 이제는 작동합니다 :) – burnersk