package AA;
package BB;
use AA;
package CC;
use BB;
CC에 "use AA"를 넣어야합니까, 아니면 내재적입니까?perl transitive에서 "use"가 사용됩니까?
package AA;
package BB;
use AA;
package CC;
use BB;
CC에 "use AA"를 넣어야합니까, 아니면 내재적입니까?perl transitive에서 "use"가 사용됩니까?
use
두 가지 작업 : 모듈이로드되지 않은 경우로드 (require
경우)하고 모듈의 import
메서드를 호출합니다. 모듈을 로딩하거나 메소드를 호출하는 것이 어떻게 변환 될 수 있는지 잘 모르겠습니다.
두 번째 질문은 주로 AA에 import
방법이 있는지 여부에 달려 있습니다.
무언가에 의해 이전에로드 되었다면 use 모듈을 사용할 수 있습니다. 그래서 다른 모듈이 만든 객체를 사용할 수 있습니다. 예를 들어 LWP
메서드에서 얻은 HTTP::Response
개체를 사용할 수 있습니다. 단, HTTP::Response
을 직접로드하지 않았거나 해당 개체 유형임을 깨닫지는 못했습니다. 그러나 use
은 호출 네임 스페이스로만 가져 오기 때문에 다른 패키지에 가져 오기가 표시되지 않습니다 (전체 패키지 사양으로 호출 할 수는 있지만).
use
패키지에서 직접 사용하려는 모든 모듈을 사용해야합니다. 즉, 직접 작성한 오브젝트의 모듈은 use
입니다.
또한 모듈을로드하기 위해 다른 패키지를 사용해서는 안됩니다. 누군가가 그 모듈을 변경하면, 왜 일이 파괴되었는지 궁금 할 것입니다. 그리고, 심지어 모듈 로딩 순서에 의존하여 모든 모듈이 제대로 작동하는지 확인하십시오.
주로 관련된 모듈이 객체 지향 모듈인지 아니면 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
이라면 BB
과 AA
의 모든 메소드는 에만 use BB
을 사용하여 사용할 수 있습니다.
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';
.
'CC'에서 'AA'의 내용을 사용하려고했을 때 무슨 일이 일어 났습니까? –
이전에 시도하지 못했습니다. 큰 코드베이스를 검토 중이 었는데이 문제가 내 마음에 들었습니다. 답장을 보내 주셔서 감사합니다! – trinity