Как создать модуль 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