2012-07-09 3 views
2
package AA; 

package BB; 
use AA; 

package CC; 
use BB; 

CC에 "use AA"를 넣어야합니까, 아니면 내재적입니까?perl transitive에서 "use"가 사용됩니까?

+6

'CC'에서 'AA'의 내용을 사용하려고했을 때 무슨 일이 일어 났습니까? –

+0

이전에 시도하지 못했습니다. 큰 코드베이스를 검토 중이 었는데이 문제가 내 마음에 들었습니다. 답장을 보내 주셔서 감사합니다! – trinity

답변

4

use 두 가지 작업 : 모듈이로드되지 않은 경우로드 (require 경우)하고 모듈의 import 메서드를 호출합니다. 모듈을 로딩하거나 메소드를 호출하는 것이 어떻게 변환 될 수 있는지 잘 모르겠습니다.

두 번째 질문은 주로 AA에 import 방법이 있는지 여부에 달려 있습니다.

9

무언가에 의해 이전에로드 되었다면 use 모듈을 사용할 수 있습니다. 그래서 다른 모듈이 만든 객체를 사용할 수 있습니다. 예를 들어 LWP 메서드에서 얻은 HTTP::Response 개체를 사용할 수 있습니다. 단, HTTP::Response을 직접로드하지 않았거나 해당 개체 유형임을 깨닫지는 못했습니다. 그러나 use은 호출 네임 스페이스로만 가져 오기 때문에 다른 패키지에 가져 오기가 표시되지 않습니다 (전체 패키지 사양으로 호출 할 수는 있지만).

use 패키지에서 직접 사용하려는 모든 모듈을 사용해야합니다. 즉, 직접 작성한 오브젝트의 모듈은 use입니다.

또한 모듈을로드하기 위해 다른 패키지를 사용해서는 안됩니다. 누군가가 그 모듈을 변경하면, 왜 일이 파괴되었는지 궁금 할 것입니다. 그리고, 심지어 모듈 로딩 순서에 의존하여 모든 모듈이 제대로 작동하는지 확인하십시오.

-1

주로 관련된 모듈이 객체 지향 모듈인지 아니면 Exporter을 사용하여 호출 패키지에서 심볼을 사용할 수있는 간단한 모듈인지 여부에 따라 달라집니다.

어떤 모듈이 require 인 경우 먼저 import 메서드를 호출합니다.

require 먼저 모듈이 이미 성공적으로로드되었는지 확인하려면 %INC을 확인하십시오. 일치하지 않는 경우 @INC의 모든 경로에서 일치하는 모듈 파일을 검색하고 첫 번째 일치 항목에 do을로드합니다.

import 방법은 저자가 작성하는 걱정 아무것도 할 수있는 모듈 있지만, 일반적으로 모듈은 다른 것들 사이에, 사본이 호출 패키지 패키지의 @IMPORT 배열의 기호는을, import 방법을 제공 Exporter 서브 클래스합니다 기호는 패키지 이름으로 완전히 규정하지 않고도 사용할 수 있습니다.

예에서 모듈 하위 클래스 Exporter 인 경우 @BB::IMPORT에 나열된 기호가 CC 네임 스페이스에 복사되어 해당 패키지에서 사용될 수 있습니다. 패키지가 객체 지향 모듈 및 BB 서브 클래스 AA 경우, 명시 적 등 AA::subroutine() 한편

로를 호출하여 아무것도하지만 AA에서 수입되지 않은, 그래서 서브 루틴이 호출 할 수 있습니다에서 정상적으로이 no import 메소드를 호출하고 축약 된 변수 나 클래스 이름 (패키지 이름)을 통해 메소드에 액세스합니다.BB에 정의되지 않은 메소드는 AA에서 상속 될 수 있으며 Perl의 객체 지향 상속 시스템 구현은 패키지의 @ISA 배열을 사용하여 메소드 검색을 계속할지 결정합니다.

요약하면 BB 서브 클래스 Exporter 하위 모듈은 use AA이어야합니다. 그러나 그것이 객체 지향이고 서브 클래스가 AA이라면 BBAA의 모든 메소드는 에만 use BB을 사용하여 사용할 수 있습니다.

1
package AA; 

package BB; 
use AA; 

package CC; 
use BB; 

거의 동일하다 :

package CC; 
use BB; 
BEGIN{ require AA } 

또는

package CC; 
use BB; 
use AA(); 

use 두 가지 일을하기 때문이다. 파일을 require으로로드 한 다음 import 메서드를 호출합니다.

이렇게 동등합니다. 당신은 더 이상 use AA; 라인을 필요로하지 않는다 BB 문제의 경우 패키지를 가질 수 있고, 그것을 제거됩니다

BEGIN { require Module; Module->import(qw'LIST'); } 

use Module qw'LIST'; 
.