패키지 이름의 폴더가 패키지를 만들기 위해 존재해야합니까?

StackOverflow https://stackoverflow.com/questions/468818

  •  19-08-2019
  •  | 
  •  

문제

우리는 Perl 프로젝트에서 공통 코드를 고려하고 있습니다. 하나의 기본 프로그램은 재사용 가능한 여러 모듈로 분할해야합니다.

우리의 프로그램 이름입니다 validate_results.pl 여기에는 유효성 검사 명령 세트가 포함되어 있습니다. 우리는 이것을 작은 모듈로 나눌 계획이므로 validate_results.pl 같아야합니다 :

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

내 이해에 따라 공통 폴더를 만들어야합니다. Validate_Results.pm 존재해야합니다. 다시 Common, Validate_Results 폴더는 그 아래에 생성되어야합니다 CommonCommands 그리고 ReturnCodeValidation 폴더가 있어야합니다.

이 모든 폴더가 존재해야합니까, 아니면 모든 Perl 프로그램을 단일 폴더에 가질 수 있고 논리적으로 그룹화하고 모듈에 액세스하기 위해 위의 방법을 사용하십시오 (예 : 사용 common::validate_results 그렇게).

도움이 되었습니까?

해결책

파일 시스템 계층 구조가 필요합니다. A :: B :: C는 항상 @INC 어딘가에 A/B/C.PM에 있습니다.

만약 너라면 가지다 이것을 돌아 다니려면 읽으십시오 perldoc -f가 필요합니다, 특히 @inc의 서브 루틴 참조에 관한 섹션을 찾고 있습니다. 예, 모듈 로더가 당신이 정말로 원하는 것이라면 이상한 일을하게 할 수 있습니다. 그러나 그것은 당신이 원하는 것이 아닙니다. 나를 믿으십시오. Perl 응용 프로그램의 다른 99.9999999%와 마찬가지로 컨벤션을 고수하십시오.

다른 팁

모듈을 '사용'하려면 구조를 준수해야합니다. 주위를 돌아 다니려면 대신 모듈을 '요구'할 수 있으시면 필수 이름을 전달하십시오.

그래도 당신은 정말로 이것을하지 말아야합니다. 디렉토리 구조를 원하지 않는다면 모듈 이름에서 벗어나십시오 (CPAN에서 더 일반적인 것으로 충돌하는 모듈 이름이있는 경우 미래에 문제가 발생할 수 있습니다). 찾기 :: bin을 통해 스크립트 디렉토리를 Inc 경로에 추가하고 모듈을 직접 사용하기 만하면됩니다.

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

HTH

다음은 모듈의 예이며 동일한 파일의 하위 모듈입니다.

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

프로그램에서 모듈을 사용하는 경우 foo (.pm 파일이있는 것) :

use Foo;

당신은 액세스 할 수 있습니다 foo :: 바 표준 이름 만 제외한 기능 (foo :: bar :: from_foo_bar). 다음과 같이 가져올 수 있습니다.

use Foo;
Foo::Bar->import;

이것을 할 수 없다는 점에 유의하십시오.

use Foo::Bar;

파일이 없기 때문입니다 foo/bar.pm.

'사용'명령의 패키지 이름은 사실상 .pm 파일로 끝나는 경로이므로 모든 패키지 이름이있는 폴더가 필요하지 않습니다. 예에서는 폴더가 필요합니다.

Common
Common/Validate_Results

그러나 폴더가 필요하지 않습니다.

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

.pm 파일의 실제 패키지 이름이로드하는 '사용'명령의 이름과 동일 할 필요는 없습니다. 그러나 패키지 이름과 일치하는 경로를 유지하는 것은 항상 좋은 생각입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top