Как вы создаете модуль Perl? - PullRequest
       19

Как вы создаете модуль Perl?

17 голосов
/ 15 февраля 2009

Как вы пишете модуль для Perl? В Python вы можете использовать:

# module.py
def helloworld(name):
    print "Hello, %s" % name

# main.py
import module
module.helloworld("Jim")

Ответы [ 8 ]

27 голосов
/ 15 февраля 2009

А класс:

# lib/Class.pm
package Class;
use Moose;

# define the class

1;

Модуль, который экспортирует функции:

# lib/A/Module.pm
package A::Module;
use strict;
use warnings;
use Sub::Exporter -setup => {
    exports => [ qw/foo bar/ ],
};

sub foo { ... }
sub bar { ... }

1;

Скрипт, который использует их:

# bin/script.pl
#!/usr/bin/env perl

use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin/../lib";

use Class;
use A::Module qw(foo bar);


print Class->new;
print foo(), bar();
25 голосов
/ 15 февраля 2009

В основном вы создаете файл с именем Yourmodulename.pm, содержимое которого:

package Yourmodulename;

# Here are your definitions

1; # Important, every module should return a true value

Тогда программа, использующая модуль, будет выглядеть так:

#!/usr/bin/perl
use strict;            # These are good pragmas
use warnings;      

# Used modules
use Carp;              # A module that you'll probably find useful
use Yourmodulename;    # Your module

Возможно, вы захотите организовать свои модули иерархическим (и, надеюсь, логичным) способом. Для этого вы создаете дерево каталогов, например:

Ваш / Module.pm
Ваш / Другое / Module.pm

А потом в вашей программе:

use Your::Module;
use Your::Other::Module;

Есть больше возможностей для экспорта функций и переменных из вашего модуля, вы можете взглянуть на Хеннинга Коха: «Написание серьезного Perl: абсолютный минимум, который вам нужно знать» .

14 голосов
/ 15 февраля 2009

«Точный» эквивалент вашего примера Python на Perl будет выглядеть так:

# MyModule.pm
package MyModule;

sub helloworld { 
    my ( $name ) = @_;
    print "Hello, $name\n";
}

1;

# main.pl
use MyModule;
MyModule::helloworld( 'Jim' );

Подробнее см. запись для package в документации perlfunc . Для получения дополнительной информации см. Документацию perlmod .

11 голосов
/ 16 февраля 2009

Последняя треть Intermediate Perl посвящена созданию модуля.

Если вы хотите узнать, как что-то сделать в Perl, проверьте perltoc, оглавление документации по Perl:

% perldoc perltoc

Несколько частей базовой документации по Perl могут вам помочь:

Удачи,

6 голосов
/ 15 февраля 2009

Одна небольшая деталь, о которой пока не упоминалось в ответах, заключается в том, что если у вас есть (желательно небольшой) модуль, который достаточно специфичен для конкретной цели, чтобы его никогда не использовать повторно, вы можете поместить его в тот же файл, Основная программа или другой пакет:

# main.pl

# Since this is a beginner question, I'll also point out that you should
# *always* use strict and warnings.  It will save you many headaches.
use strict;
use warnings;

MyModule::helloworld('Jim');
AnotherModule::helloworld('Jim');

package MyModule; # Still in main.pl!

sub helloworld { 
    my ( $name ) = @_;
    print "Hello, $name\n";
}

package AnotherModule; # Yep, still main.pl

sub helloworld {
    my $name = shift;
    print "Another hello to $name\n";
}

Это не часто используется, потому что он дает вам пакет, который определен в файле, имя которого не совпадает с именем пакета, что может сбить с толку, потому что вам нужно use / require имя файла, но ссылаться на него в коде по имени пакета.

Также обратите внимание, что 1; требуется только в качестве последней строки каждого файла, который включается через use / require. В этом случае мне это не нужно, потому что оно в main.pl. Если вы помещаете несколько пакетов в один файл, вам нужен только 1; в конце файла, а не после каждого пакета.

5 голосов
/ 18 февраля 2009

Наиболее традиционный способ настройки модуля заключается в следующем:

package Foo::Bar;
our @ISA       = qw(Exporter);       # Tells perl what to do with...
our @EXPORT    = qw(sub1 sub2 sub3); # automatically exported subs
our @EXPORT_OK = qw(sub4 sub5);      # exported only when demanded

# code for subs, constants, package variables here

1;  # Doesn't actually have to be 1, just a 'true' value.

и, как уже говорили другие, вы можете использовать его так:

use Foo::Bar;
2 голосов
/ 15 сентября 2014
cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module
2 голосов
/ 04 октября 2011

h2xs -XA -n My :: Module

h2xs - это утилита, стандартно поставляемая с perl, предназначенная для помощи в создании связанных модулей, включая связанные заголовки / код C, но ее можно использовать для создания полного скелета чистого модуля perl (с флагами -XA) , включая такие вещи, как тестовый каталог, файл README, Makefile и Manifest. (хорошая статья с подробным изложением здесь: http://perltraining.com.au/tips/2005-09-26.html)

Это своего рода старая школа, но на нее стоит взглянуть, даже если она напомнит вам о том, что все правильно (тесты, документация, номера версий, списки export и export_ok, все легко забываемые вещи). ..)

В результате вы получите файл «Module.pm» в папке «My» (из «My :: Module»), который выглядит следующим образом:

package My::Module;

use 5.008008;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration       use My::Module ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(

);

our $VERSION = '0.01';


# Preloaded methods go here.

1;
__END__
# Below is stub documentation for your module. You'd better edit it!

=head1 NAME

My::Module - Perl extension for blah blah blah
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...