Perl 모듈
Perl modulePerl 모듈은 Perl 프로그래밍 언어용 소프트웨어의 개별 컴포넌트입니다.엄밀히 말하면, 이것은 Perl의 패키지 메커니즘을 사용하기 위한 특별한 규칙 세트이며, 보편적으로 [discuss]채택되고 있습니다.
모듈은 CGI 또는 Net과 같은 네임스페이스를 정의하기 위한 Perl 메커니즘인 패키지(Java 패키지와 유사)에 소스 코드를 정의합니다.FTP 또는 XML::파서. 파일 구조는 네임스페이스 구조를 미러링합니다(예: Net의 소스 코드::FTP 는 Net/FTP.pm 에 있습니다.또한 모듈은 객체 지향 프로그래밍을 [discuss]사용할 때 클래스와 동등한 Perl입니다.
모듈 모음과 함께 설명서, 빌드 스크립트 및 일반적으로 테스트 스위트가 배포를 구성합니다.Perl 커뮤니티에는 CPAN을 통해 검색 및 다운로드할 수 있는 대규모 배포 라이브러리가 있습니다.
Perl은 다양한 스타일의 프로그래밍을 허용하는 언어입니다.개발자는 절차 스타일로 작성된 모듈을 찾을 수 있습니다(예: 테스트:단순)은 객체 지향(예: XML:: 파서)으로 모듈이 수행해야 하는 작업에 따라 둘 다 동일하게 유효한 것으로 간주됩니다.모듈은 혼합 메서드에 사용할 수도 있습니다(DBIX:Class) 또는 플러그마(strict.pm)가 되어 로드 즉시 효과가 있습니다.모듈을 사용하여 언어의 구문을 변경할 수도 있습니다.Perl 모듈의 영향은 통상 로드된 현재 범위로 제한됩니다.
Perl 모듈에는 보통 Perl의 Plain Old Documentation 형식으로 문서가 포함되어 있습니다.POD는 작성자에게 거의 영향을 주지 않습니다.이것은 기사, 웹 페이지, 심지어 프로그래밍 펄과 같은 전체 책을 쓰는 데 사용될 만큼 충분히 유연하다.Java 클래스 문서화에 특화된 javadoc과 대조됩니다.일반적으로 모듈 매뉴얼은 Unix man 페이지의 구조를 따릅니다.
Perl 언어는 단일 구현('perl'이라고 함)에 의해 정의되며, 각 새로운 릴리스에 추가됩니다(경우에 따라서는 제외되는 경우도 있습니다.따라서 모듈 작성자는 어떤 기능을 사용하고 있는지, 필요한 최소한의 Perl 버전이 무엇인지 알고 있어야 합니다.이 페이지의 코드에는 perl 5.6.0이 필요합니다.이러한 코드에는 perl 5.6.0이 필요합니다.
예
다음은 다양한 스타일의 모듈에 구현된 "Hello, World"의 예입니다.Perl에서는 모듈이 필요하지 않습니다.함수와 코드는 어디에서나 정의 및 사용할 수 있습니다.이것은 단지 예시를 위한 것입니다.클래스가 항상 필요한 Java와 대조됩니다.실제 "Hello, World" 함수는 다음과 같이 작성됩니다.
후보선수 안녕 { 안녕, 세상아!\n" } 인쇄물 안녕();
또는 한 줄에 인쇄합니다.
인쇄물 안녕, 세상아!\n";
절차 예시
다음은 인사말의 대상을 커스터마이즈할 수 있는 절차 모듈로 구현된 "Hello, World"입니다.또한 모듈의 사용법을 설명하는 짧은 스크립트도 포함되어 있습니다.
hello_world.pl
#!/usr/bin/module # 모듈을 로드하고 모든 함수를 네임스페이스로 Import합니다. 모듈에 의해 내보낸 번호("메인")입니다.안녕하세요:세계 수출 디폴트로는 # hello() 입니다.통상, export는 발신자가 제어할 수 있습니다. 사용하다 안녕하세요: 세계; 인쇄물 안녕(); # 인쇄물 "안녕, 세상아!\n" 인쇄물 안녕('밀키웨이'); # 인쇄물 "안녕, 은하수!\n"
안녕하세요/World.pm
# "module"은 모듈의 기능/데이터가 있는 네임스페이스입니다. # 「use」d 로 하고 싶은 경우는, 파일명을 지정합니다. # 여러 워드의 경우 모듈의 위치가 제한됩니다. 패키지 안녕하세요: 세계; # 기본적으로 Perl에서는 변수를 선언하지 않고 사용할 수 있습니다. 단문 대본이나 한 줄짜리 대본에는 편리할 것 같습니다. # 단, 모듈 등 코드 단위가 긴 경우에는 선언하는 것이 현명합니다. # 오타를 포착하고 오타를 억제하기 위한 변수 # 모듈 외부로부터의 적절한 접근성.엄격한 프래그마 # 는 변수를 강제로 선언합니다. 사용하다 엄격한.; # 마찬가지로 Perl은 기본적으로 대부분의 컴파일러 또는 런타임 경고를 발행하지 않습니다. # 대부분의 모듈 등 보다 복잡한 스크립트는 보통 매우 복잡합니다. # 디버깅에 도움이 됩니다.warnings plagma는 옵션의 경고를 활성화합니다. 사용하다 경고.; # 모듈의 버전 번호는 $ModuleName에 저장됩니다.버전, 특정 기본 제공 "use"의 # 형식은 정의되는 변수에 따라 달라집니다. 우리들의 $버전 = '1.00'; # 내보내기 기능을 처리하는 "내보내기" 모듈에서 상속합니다. # 대부분의 절차 모듈은 이 기능을 사용합니다. 사용하다 기초 '엑스포터'; # 모듈이 호출되면 디폴트로 "hello" 함수를 다음 주소로 내보냅니다. # 사용중인 코드의 네임스페이스. 우리들의 @export = qw(hello); # 등호로 시작하는 행은 내장된 POD를 나타냅니다. # 문서.POD 섹션은 = 절단 지시문으로 끝나며, 다음을 수행할 수 있습니다. # 일반 코드와 거의 자유롭게 혼합됩니다. =head1 이름 Hello:: World: 공통 출력 메시지 캡슐화 =head1 개요 Hello 사용:세계 print hello(); print hello("Milky Way"); =head1 설명 이것은 유명한 "안녕하세요, 세상!"을 알려주는 절차 모듈입니다. 메시지, 커스터마이즈도 가능합니다! =head2 기능 다음 함수는 기본적으로 내보냅니다. =head3 안녕하세요 print hello(); print hello(타겟); 유명한 그리팅을 반환합니다.C <$target>가 지정되면 사용됩니다. 그렇지 않으면 "world"가 그리팅의 대상이 됩니다. =컷 # hello 함수를 정의합니다. 후보선수 안녕 { 나의 $target($target) = 교대하다; $target($target) = '세계' ~하지 않는 한 정의되어 있다 $target($target); 돌아가다 "안녕하세요, $target!\n"; } =head1 작성자 Joe Hacker <joe@joehacker.org> =컷 # Perl 모듈은 true 값으로 끝나야 합니다.그렇지 않으면 다음 값이 아닌 것으로 간주됩니다. #가 로드되었습니다.관례상 이 값은 보통 1이지만 다음과 같습니다. # 임의의 진정한 값모듈은 false로 끝나 장애를 나타낼 수 있지만 # 이것은 거의 사용되지 않고 대신 die()가 됩니다(오류가 있는 경우). 1;
Hello/World.pm은 @INC 경로에 없으므로 위의 예를 실행하려면 명령줄에서 를 지정해야 합니다.
perl - I.hello_world.pl
오브젝트 지향의 예
다음은 동일한 작업을 객체 지향 스타일로 수행하는 예입니다.OO 모듈의 장점은 각 개체를 다른 개체와 독립적으로 구성할 수 있다는 것입니다.
hello_world.pl
#!/usr/bin/module 사용하다 안녕하세요: 세계; 나의 $hello = 안녕하세요: 세계->신규; $hello->인쇄물; # 인쇄물 "안녕, 세상아!\n" $hello->타깃('밀키웨이'); $hello->인쇄물; # 인쇄물 "안녕, 은하수!\n" 나의 $140 = 안녕하세요: 세계->신규(타깃 => 피트스버그); $140->인쇄물; # prints "안녕하세요, 피츠버그!\n" $hello->인쇄물; #는 여전히 "안녕, 은하수!\n"
안녕하세요/World.pm
# Perl에는 특별한 '클래스' 정의는 없습니다.네임스페이스는 클래스입니다. 패키지 안녕하세요: 세계; 사용하다 엄격한.; 사용하다 경고.; 우리들의 $버전 = "1.00"; =head1 이름 Hello:: World: 공통 출력 메시지 캡슐화 =head1 개요 Hello 사용:세계 my $hello = 안녕하세요:월드->신규(); $hello->프린트; =head1 설명 이것은 유명한 "H.W."를 인쇄할 수 있는 객체 지향 도서관입니다. 메세지. =head2 방법 =헤드 3신품 my $hello = 안녕하세요:월드->신규(); my $hello = 안녕하세요:World - > new (타깃 = > $target ); 그리팅 메시지를 보관하고 있는 개체를 인스턴스화합니다.C <$target>가 다음과 같은 경우 C << $hello - > target >로 전달됩니다. =컷 # 객체의 컨스트럭터는 관례상 new()라고 불립니다.조금도 # 메서드는 오브젝트를 작성할 수 있으며 원하는 수만큼 가질 수 있습니다. 후보선수 신규 { 나의($클래스, %140s) = @_; 나의 자기 부담 = 축복하다({}, $클래스); 나의 $target($target) = 존재한다 $195s{타깃} ? $195s{타깃} : "세계"; 자기 부담->{타깃} = $target($target); 돌아가다 자기 부담; } =head 3 대상 나의 $target = $hello-> 타겟; $hello-> target (타깃); 메시지의 현재 대상을 가져오고 설정합니다. =컷 후보선수 타깃 { 나의 자기 부담 = 교대하다; 한다면 ( @_ ) { 나의 $target($target) = 교대하다; 자기 부담->{타깃} = $target($target); } 돌아가다 자기 부담->{타깃}; } =head3 to_string my $syslog = $hello->to_string; $그리팅을 문자열로 반환합니다. =컷 후보선수 스트링 { 나의 자기 부담 = 교대하다; 돌아가다 "안녕하세요, $self-> {target}!"; } =헤드3 프린트 $hello->프린트; 그리팅을 STDOUT에 출력합니다. =컷 후보선수 인쇄물 { 나의 자기 부담 = 교대하다; 인쇄물 자기 부담->스트링(), "\n"; } =head1 작성자 Joe Hacker <joe@joehacker.org> =컷 1;
Perl 패키지 및 네임스페이스
실행 중인 Perl 프로그램에는 "라는 이름의 네임스페이스가 내장되어 있습니다.main
" 이 기본 이름입니다.예를 들어 서브루틴은Sub1
라고 불릴 수 있다Sub1()
또는main::Sub1()
변수를 사용하면 적절한 기호가 네임스페이스 앞에 배치됩니다.따라서 스칼라 변수는$var1
라고도 할 수 있다$main::var1
또는 심지어$::var1
기타 네임스페이스는 언제든지 만들 수 있습니다.
패키지 네임스페이스 1; $var1 = 1; Namespace1에 생성된 #. Namespace1도 존재하지 않는 경우 생성됩니다. 우리들의 $var2 = 2; #도 해당 네임스페이스에 작성되었습니다.사용 시 strict가 적용됩니다. 나의 $var3 = 3; # 어휘 범위 my-declared - 네임스페이스에 없음, 메인에도 없음
$네임스페이스2::변수 1 = 10; 네임스페이스2에 작성된 번호(기존이 아닌 경우에도 작성) 우리들의 $네임스페이스2::변수 2 = 20; #도 해당 네임스페이스에 작성되었습니다. 나의 $네임스페이스2::바3 = 30;# 컴파일 오류: my-declared 변수가 패키지에 속할 수 없습니다.
패키지 선언은 다음 패키지 선언 또는 선언이 이루어지는 블록의 마지막까지 패키지 범위를 적용합니다.
우리들의 $mainVar = 'a'; 패키지 SP1; 우리들의 $sp1aVar = '아'; 인쇄물 "$main::mainVar\t$sp1aVar\n"; # 주의: mainVar의 수식 필요 패키지 SP2; 우리들의 $sp2aVar = '실패'; 인쇄물 "$main::mainVar\t$Sp1::sp1aVar\t$sp2aVar\n";# mainVar 및 sp1aVar 수식 필요 패키지 주된; 인쇄물 "$mainVar\t$Sp1::sp1aVar\t$Sp2::sp2aVar\n"; # 주의: sp1aVar 및 sp2aVar 인정 필요 $mainVar = 'b'; { # 주의: 이전에 작성한 패키지와 패키지 변수는 아직 액세스할 수 있습니다. 패키지 SP1; 우리들의 $sp1bVar = 'bb'; 인쇄물 "$main:: mainVar\t$sp1aVar\t$sp1bVar\n"; # 주의: mainVar의 수식 필요 { 패키지 SP2; 우리들의 $sp2bVar = 'bbb'; 인쇄물 "$main::mainVar\t$Sp1::sp1aVar$Sp1::sp1bVar\t$sp2aVar$sp2bVar\n"; } # mainVar 및 sp1을 메모합니다...Var의 자격요건 인쇄물 "$main::mainVar\t$sp1aVar\t$Sp2:sp2bVar$Sp2:sp2aVar\n"; } # 패키지 Sp1이 기본적으로 적용됩니다. # main은 기본적으로 다시 적용됩니다.모든 패키지 변수는 정규화된 한 계속 액세스할 수 있습니다. 인쇄물 "$mainVar\t$Sp1::sp1aVar$Sp2::sp2bVar\n";
패키지 및 모듈
일반적으로 네임스페이스는 모듈과 관련지어집니다.실제로는 모듈마다 하나의 네임스페이스가 있으며, 그 반대도 마찬가지입니다만, 이것은 언어에 의해서 강제되는 것은 아닙니다.예를 들어 'standard' 모듈 CGI.pm의 선두에는 다음과 같은 선언이 있습니다.
패키지 CGI;
이 모듈과 그 기능은 일반적으로 다음과 같이 호출됩니다.
사용하다 CGI (': 표준'); #는 b()를 포함한 많은 함수를 Import합니다. ... 인쇄물 b('안녕, 세상아'); # 출력 <b> 헬로 월드 </b>
프로그램의 네임스페이스를 사용하여 '누락된' 서브루틴을 추가할 수 있습니다.
후보선수 CGI:: bi { # 타겟 네임스페이스(CGI) 및 서브네임(bi) 정의 돌아가다 b(i($_[0])); }
다음과 같이 호출됩니다.
인쇄물 CGI::바이('안녕, 세상아'); # 출력 <b> <i>안녕, 월드 </i> </b>
그러나 기술적으로 실현 가능하기는 하지만, 그것은 의심스러운 프로그래밍 연습이 될 것입니다.발신측 네임스페이스에 서브를 정의하고, 그 네임스페이스에서 서브를 호출할 수도 있습니다.