펄 모듈

펄 모듈(Perl module)은 펄 언어의 소프트웨어 구성 요소이다.
모듈은 마치 자바 패키지처럼 소스 코드가 "CGI", "Net:FTP", "XML::Parser"와 같은 이름공간을 정의하기 위한 펄 매커니즘인 패키지 안에 있을 수 있도록 정의한다. 즉, 파일 구조는 이름공간 구조를 미러링한다. (예: Net::FTP를 위한 소스 코드는 Net/FTP.pm에 속한다)
예제.
"Hello, World!"의 예는 여러 스타일로 구현할 수 있다. 펄에서는 모듈이 반드시 필요한 것이 아니다. 함수와 코드는 어디에서든 정의하여 사용할 수 있다. 아래는 단지 예를 들기 위한 부분이다. 클래스가 꼭 필요한 자바와 다르다. "Hello, World"의 함수는 다음과 같이 작성할 수 있다:
print hello();
아니면 단순히 한 줄로도 가능하다:
print "Hello, world!\n";
절차적 예제.
절차적 모듈로 구현한 "Hello, World"의 예는 다음과 같다. 모듈 이용을 기술하는 짧은 스크립트도 포함되어 있다.
"hello_world.pl"
use Hello::World;
print hello(); # prints "Hello, world!\n"
print hello("Milky Way"); # prints "Hello, Milky Way!\n"
"Hello/World.pm"
 # "package" is the namespace where the module's functionality/data resides.
 # It dictates the name of the file if you want it to be "use"d.
 # If more than one word, it constrains the location of the module.
 package Hello::World;
 # By default Perl allows you to use variables without declaring
 # them. This may be convenient for short scripts and one-liners.
 # But in a longer unit of code such as a module it is wise to declare
 # your variables both to catch typos and to constrain their
 # accessibility appropriately from outside the module. The strict pragma
 # forces you to declare your variables.
 use strict;
 # Similarly, Perl does not issue most compiler or run-time warnings by default.
 # More complicated scripts, such as most modules, will usually find them very
 # helpful for debugging. The warnings pragma turns on optional warnings.
 use warnings;
 # A module's version number is stored in $ModuleName::VERSION; certain
 # forms of the "use" built-in depend on this variable being defined.
 our $VERSION = '1.00';
 # Inherit from the "Exporter" module which handles exporting functions.
 # Most procedural modules make use of this.
 use base 'Exporter';
 # When the module is invoked, export, by default, the function "hello" into
 # the namespace of the using code.
 our @EXPORT = qw(hello);
 # Lines starting with an equal sign indicate embedded POD
 # documentation. POD sections end with an =cut directive, and can
 # be intermixed almost freely with normal code.
 =head1 NAME
 Hello::World - An encapsulation of a common output message
 =head1 SYNOPSIS
 use Hello::World;
 print hello();
 print hello("Milky Way");
 =head1 DESCRIPTION
 This is a procedural module which gives you the famous "Hello, world!"
 message, and it’s even customizable!
 =head2 Functions
 The following functions are exported by default
 =head3 hello
 print hello();
 print hello($target);
 Returns the famous greeting. If a C&lt;$target&gt; is given it will be used,
 otherwise "world" is the target of your greeting.
 =cut
 # define the function hello().
 sub hello {
 my $target = shift;
 $target = 'world' unless defined $target;
 return "Hello, $target!\n";
 =head1 AUTHOR
 Joe Hacker &lt;joe@joehacker.org&gt;
 =cut
 # A Perl module must end with a true value or else it is considered not to
 # have loaded. By convention this value is usually 1 though it can be
 # any true value. A module can end with false to indicate failure but
 # this is rarely used and it would instead die() (exit with an error).
 1;
객체 지향 예제.
동일하지만 객제 지향 스타일로 된 예는 다음과 같다. 객체 지향 모듈의 이점은 각 객체가 다른 객체와 독립적으로 구성될 수 있다는 점이다.
"hello_world.pl"
 #!/usr/bin/perl
 use Hello::World;
 my $hello = Hello::World-&gt;new;
 $hello-&gt;print; # prints "Hello, world!\n"
 $hello-&gt;target("Milky Way");
 $hello-&gt;print; # prints "Hello, Milky Way!\n"
 my $greeting = Hello::World-&gt;new(target =&gt; "Pittsburgh");
 $greeting-&gt;print; # prints "Hello, Pittsburgh!\n"
 $hello-&gt;print; # still prints "Hello, Milky Way!\n"
"Hello/World.pm"
 # In Perl there is no special 'class' definition. A namespace is a class.
 package Hello::World;
 use strict;
 use warnings;
 our $VERSION = "1.00";
 =head1 NAME
 Hello::World - An encapsulation of a common output message
 =head1 SYNOPSIS
 use Hello::World;
 my $hello = Hello::World-&gt;new();
 $hello-&gt;print;
 =head1 DESCRIPTION
 This is an object-oriented library which can print the famous "H.W."
 message.
 =head2 Methods
 =head3 new
 my $hello = Hello::World-&gt;new();
 my $hello = Hello::World-&gt;new( target =&gt; $target );
 Instantiates an object which holds a greeting message. If a C&lt;$target&gt; is
 given it is passed to C« $hello-&gt;target ».
 =cut
 # The constructor of an object is called new() by convention. Any
 # method may construct an object and you can have as many as you like.
 sub new {
 my($class, %args) = @_;
 my $self = bless({}, $class);
 my $target = exists $args{target} ? $args{target} : "world";
 $self-&gt;{target} = $target;
 return $self;
 =head3 target
 my $target = $hello-&gt;target;
 $hello-&gt;target($target);
 Gets and sets the current target of our message.
 =cut
 sub target {
 my $self = shift;
 if( @_ ) {
 my $target = shift;
 $self-&gt;{target} = $target;
 return $self-&gt;{target};
 =head3 to_string
 my $greeting = $hello-&gt;to_string;
 Returns the $greeting as a string
 =cut
 sub to_string {
 my $self = shift;
 return "Hello, $self-&gt;{target}!";
 =head3 print
 $hello-&gt;print;
 Outputs the greeting to STDOUT
 =cut
 sub print {
 my $self = shift;
 print $self-&gt;to_string(), "\n";
 =head1 AUTHOR
 Joe Hacker &lt;joe@joehacker.org&gt;
 =cut
 1;