패키지 이름의 폴더가 패키지를 만들기 위해 존재해야합니까?
문제
우리는 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 파일의 실제 패키지 이름이로드하는 '사용'명령의 이름과 동일 할 필요는 없습니다. 그러나 패키지 이름과 일치하는 경로를 유지하는 것은 항상 좋은 생각입니다.