2009-08-03 7 views
9

안녕하세요 저는 회사에 더 이상없는 사람이 작성한 펄 스크립트를 사용하고 있습니다. 스크립트를 독립 실행 형으로 실행하면 예상대로 출력됩니다. 그러나 스크립트를 다른 코드에서 반복적으로 호출하면 처음을 제외하고 출력이 틀립니다.Perl 모듈을 강제로 언로드 할 수 있습니까?

일부 변수가 제대로 초기화되지 않았다고 생각됩니다. 독립 실행 형이라고 할 때마다 종료 될 때마다 모든 변수 값이 기본값으로 초기화됩니다. 그러나 다른 perl 스크립트에서 호출되면 모듈과 변수 값이 스크립트의 다음 호출로 넘겨 질 수 있습니다.
다음 번에 호출하기 전에 호출 된 스크립트를 메모리에서 플러시 할 수있는 방법이 있습니까?

경고를 사용하려고 시도했지만 경고 라인이 1000s 이상 발생했습니다 ...!

편집 : 당신이 다시로드 모듈을 강제하려면

do "processing.pl"; 
... 
... 
... 

process(params); #A function in processing.pl 
... 
... 
... 
+1

다른 스크립트는 어떻게 부르니? – innaM

+0

편집을 참조하십시오. 명확하지 않은 경우 알려주십시오. – Manoj

답변

4

스크립트를 다시 작성/수정하지 않으려면 exec() 또는 그 변형 중 하나를 통해 스크립트를 호출하는 것이 좋습니다. 매우 우아하지는 않지만 분명히 문제를 해결할 것입니다.

+1

이 문제가 어떻게 해결됩니까? 처리를 포크에 넣고 실행하는 것에 대해 생각하고 있습니까? –

+2

'exec'를 사용하는 데있어 문제는 프로그램에로드되지 않았으므로 '프로세스'기능을 호출 할 수 없다는 것입니다. 따라서 Perl이 관리 할 수있는 형식으로 exec'd 프로그램에서 정보를 다시 얻는 방법에 대해 걱정해야합니다. eval'd가 변수를 초기화 할 때 문자열을 생성하는 일종의 형식화 된 출력을 가정합니다. 그러나 코드를 정리하거나 코드를 다시 작성하는 것이 더 간단 할 수도 있습니다. –

11

%INC에서 해당 항목을 삭제 한 다음 다시로드 :

코드는 다음과 같습니다 : 나는 다른 스크립트를 호출 오전 방법 그것. 예를 들어

이 모듈은 다른 모듈에 설정되는 전역에 의존하는 경우, 그뿐만 아니라 다시로드 될 필요가있을 수 있다는

sub reload_module { 
    delete $INC{'Your/Silly/Module.pm'}; 
    require Your::Silly::Module; 
    Your::Silly::Module->import; 
} 

참고. 코드를 자세히 살펴 보지 않고도 쉽게 알 수있는 방법은 없습니다.

+2

Module :: Reload가이 세부 정보를 처리 할 것이지만 tsee의 대답에 대한 내 의견을 기록합니다. –

+0

@Brian : Module :: Reload가 Module :: Unload와 관련없는 문제를 해결합니까? 사실, 그것을 할 수 있습니까? –

0

또 다른 가능성 (여기서 큰 소리로 생각하는 것)은 로컬 디렉토리와 관련이있을 수 있습니다. 그들은 같은 장소에서 달리고 있습니다. 아마도 처음에는 작동하지 않을 것입니다.

또 다른 옵션은 system ('doprocessing.pl');입니다. 느슨하게, 우리는 몇 가지 스크립트로 이것을 수행하여 많은 수의 클래스/변수 등을 다시 초기화합니다. 그리고 로그 파일을 적절하게 회전시킵니다.

편집 : 나는 당신의 질문을 다시 읽었으며, 당신이 이것을 이렇게 부르지 않는 것처럼 보일 것입니다.

5

모듈을 언로드하는 것은 단순히 모듈의 % INC 항목을 제거하는 것보다 어렵습니다. CPAN에서 Class::Unload을보십시오.

+7

Class :: Unload는이 문제에 대한 직접적인 해결책이 아니라는 점에 유의하십시오. 목표는 특정 패키지 내부의 모든 것을 정리하는 것입니다. Perl 특수 변수를 망치거나 다른 클래스 (무언가 자주 사용하는 것)에서 정의하거나 모듈이 심볼을 포함하지 않는 다른 일을 정의하는 등 모듈이 수행했을 수도있는 다른 작업은 실행 취소하지 않습니다 표. –

+0

물론 당신 말이 맞습니다. 나는 Class :: Unload 문서가 CAVEAT 섹션을 가지고 있다는 것을 기억하고 있었지만 오인되었다. – tsee

8

안녕하세요 저는 더 이상 회사에없는 다른 사람이 작성한 펄 스크립트를 사용하고 있습니다. 경고를 활성화하려고 시도하고 1000 줄의 경고를 던지고 있습니다 ...!

거기에 문제가 있습니다. 스크립트가 제대로 작성되지 않았으므로 다시 작성해야합니다.

자신에게 질문하십시오 : 엄격한 검사를 사용할 때 1000 초의 경고가 있으면 어떻게 올바르게 수행되는지 확인할 수 있습니까? 어떻게하면 파일을 망가 트리지 않고, 데이터 세트를 파기하고, 파일 시스템을 엉망이 아닌지 확신 할 수 있습니까? 기회는 그것이 의도적으로 또는 우발적으로이 모든 것을하고 있다는 것입니다.

필자는 더 이상 회사와 관계없는 사람이 작성한 오류로 가득 찬 스크립트를 실행하지 않을 것입니다. 나는 그것을 다시 쓰고 그것을하기 위해 필요한 것을하고 있는지 확인했다.

+1

경고가없는 경우에도 올바른 일을하는지 알 수 없습니다. Perl의 버전에 따라 경고가 바뀌므로 많은 경고를 얻는 것으로부터 추측 할 수있는 것이 많지 않습니다. –

+2

나는 재 작성을 위해 우선 순위를 정해야하는 지저분한 코드베이스를 추측했다. :) 그러나 경고의 부재는 오류가 없다는 것을 나타내는 것이 아닙니다. – Ether

3

모듈을 다시로드해야합니까? do을 사용하면 매번 소스를 읽고 실행합니다. 이 값을 require으로 변경하면 소스를 한 번만 읽고 평가합니다.

관련 문제