2016-08-11 4 views
0

같은 이름의 패키지에서 다른 디렉토리에있는 다른 패키지의 함수를 호출하려고합니다. 함수도 같은 이름입니다.같은 이름의 함수를 같은 이름의 패키지에서 가져 오기

설명 : sub fun1 내가 두 번째 패키지는 anothee 디렉토리 안에

package package1; 

sub fun1($$$) 
{ 
    #anything; 
} 

통화 할 일이 내부의 내가 dir1/package1.pm

dir1/에 존재 package1.pm을 가정 해 봅시다 : dir2/package1.pm

package package1; 

sub fun1($$$) 
{ 
    #anything; 
} 

함수는 같은 수의 매개 변수를 사용합니다.

정확히 원하는 기능을 호출하는 방법은 무엇입니까?

+0

둘 모두를 동일한 프로세스에서 사용 하시겠습니까? 같은 것을 다른 버전으로 사용하는 것입니까? – simbabque

+0

정규화 된 이름을 사용하는 데 문제가 있습니까? – zdim

+0

당신이 묻고있는 것을하기 위해 내 마음에 오는 가장 순진한 방법은 좋은 방법이 아니지만 (경고를 불러오는) 좋은 방법은 아니지만 (여전히 추천하지는 않습니다. 그래서 대답으로 게시하지 않습니다) : 'unshift @INC, "yourpath/dir1"; do 'p1.pl'; package1 :: sub1(); shift @INC; unshift @INC, "yourpath/dir2"; do 'p1.pl '; package1 :: sub1(); ' – yonyon100

답변

1

패키지가있는 디렉토리 (예 : Dir1::Package1, Dir2::Package1)를 기반으로 패키지의 이름을 지정하는 것이 좋습니다.

/lib-- 
    | 
     ---/Dir1-- 
    |  | 
    |  --Dir1::Package1 
    | 
    | 
    ---/Dir2-- 
       | 
       -- Dir2::Package1 

그런 다음 스크립트에서 완전히 당신의 소원에 따라 해당 패키지에서 호출 할 수있는 서브 루틴 이름을 규정 할 수 있습니다 :와 같은 기본 (이 경우/lib 디렉토리) 디렉토리로 유지

#!/usr/bin/perl 
use strict; 
use warnings; 
use lib qw(./lib); 
use Dir1::Package1; 
use Dir2::Package1; 

# call from Dir1 Package1 
Dir1::Package1::fun(); 

# call from Dir2 Package1 
Dir2::Package1::fun(); 
+4

실제로'use' 문 모두에'qw (fun)'을 쓰는 것은 말이되지 않습니다. 첫 번째를 가져온 다음 두 번째로 덮어 씁니다. 어쨌든 정규화 된 이름으로 전화를 걸려면 아무것도 가져 오지 말라고하십시오. 이유는 무엇 때문입니다. – simbabque

+0

@simbabque 감사합니다. 어쨌든 편집되었습니다. –

0

내가 제안하는 방식이 권장 사항이 아니므로 경고 메시지가 나타납니다. 당신이 요구하는지 무엇을 내 마음에 오는 가장 순진 방법은 do을 사용하고 있습니다 :

unshift @INC, "yourpath/dir1"; 
do 'package1.pm'; 
package1::sub1(); 

shift @INC; 

unshift @INC,"yourpath/dir2"; 
do 'package1.pm'; 
package1::sub1(); 

이의 말을하자 그 sub1 인쇄 현재 디렉토리, 출력은 다음과 같이 있도록 :

dir1 
Subroutine sub1 redefined at yourpath/dir2/package1.pm line 8. 
dir2 

경고에 대한 어떤 이유로 든 신경 쓰지 않는 한 다시 사용하십시오. 그것은 미래의 많은 버그를 야기 할 수있는 나쁜 습관입니다. do로드 코드를하고 같은 이름의 패키지 do의 또 다른 호출에,이 재정의 될 것이라고 의미를로드 기억하지 않습니다 작동 왜

. 일반적으로 do을 사용하지 않지만 패키지를로드 한 것을 기억하는 require을 사용합니다. 첨부 된 코드는 do을 두 번 사용합니다. 두 번째 시간은 출력이 보이는 것처럼 첫 번째 시간보다 우선합니다.

+0

그리고 하이라이트에 대한 @imbabque에 감사드립니다! – yonyon100

관련 문제