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

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

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

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

Ответы

Ответ 1

Класс:

# 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;

A script, который использует эти:

# 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();

Ответ 2

В основном вы создаете файл с именем 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: абсолютный минимум, который вам нужно знать" .

Ответ 3

"Точный" эквивалент вашего примера 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.

Ответ 4

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

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

% perldoc perltoc

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

Удачи,

Ответ 5

Самый традиционный способ настройки модуля:

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;

Ответ 6

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

# 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; в конце файла, а не после каждого пакета.

Ответ 7

h2xs -XA -n My:: Module

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

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

В итоге вы получите файл Module.pm в каталоге "Мой" (из "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

Ответ 8

cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module