2009-02-15 26 views
16

Làm thế nào để bạn viết một mô-đun cho Perl? Trong Python bạn có thể sử dụng:Làm cách nào để tạo mô-đun Perl?

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

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

Trả lời

27

Một lớp:

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

# define the class 

1; 

Một mô-đun đó xuất khẩu chức năng:

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

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

1; 

Một kịch bản có sử dụng sau đây:

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

Thú vị ... trong tất cả các mô-đun tôi đã nhìn thấy, cách làm xuất khẩu đã được wit h "@ qw qw (Nhà xuất khẩu) của chúng tôi; của chúng tôi @ EXPORT = qw (funcx funcy funcz) ", ngay cả trong PBP. –

+4

Xuất khẩu được xây dựng trong, nhưng nó sucks S :: Ex là nhiều ... sexier :) – jrockway

+2

Đúng. Nhưng sau đó bạn phải phân phối Sub: (Nhưng tôi đoán, nếu bạn đang sử dụng Moose, bạn đã đi xuống con đường đó!) –

24

Về cơ bản bạn tạo một tệp có tên là.210 dân có nội dung:

package Yourmodulename; 

# Here are your definitions 

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

Sau đó, chương trình có sử dụng các mô-đun sẽ trông giống như:

#!/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 

Bạn có thể muốn tổ chức các module của bạn theo một cách thứ bậc (và hy vọng logic). Để làm như vậy bạn tạo một cây thư mục như:

bạn/Module.pm
bạn/Khác/Module.pm

Và sau đó trong chương trình của bạn:

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

Hiện có nhiều cơ sở vật chất để xuất các hàm và biến từ mô-đun của bạn, bạn có thể xem qua số "Writing serious Perl: The absolute minimum you need to know" của Henning Koch.

+0

Cảm ơn bạn brian :) – tunnuz

14

An "chính xác" tương đương với ví dụ Python của bạn trong Perl sẽ trông như thế này:

# MyModule.pm 
package MyModule; 

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

1; 

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

Để biết thêm, xem the entry for package in perlfunc tài liệu. Để biết thêm thông tin, hãy xem tài liệu perlmod.

6

Một chi tiết nhỏ mà câu trả lời cho đến nay chưa được đề cập là, nếu bạn có mô-đun (tốt nhất là nhỏ) đủ cụ thể để nó sẽ không bao giờ được sử dụng lại, bạn có thể đặt nó vào cùng một tệp chương trình chính hoặc gói khác:

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

này không được sử dụng thường xuyên bởi vì nó cung cấp cho bạn một gói phần mềm đó là định nghĩa trong một tập tin có tên không giống như các gói, mà có thể gây nhầm lẫn bởi vì bạn phải use/require tên tệp, nhưng tham chiếu nó bằng mã theo tên gói.

Cũng lưu ý rằng chỉ cần 1; làm dòng cuối cùng của mỗi tệp được bao gồm qua use/require. Trong trường hợp này, tôi không cần nó vì nó ở trong main.pl. Nếu bạn đặt nhiều gói vào cùng một tệp, bạn chỉ cần 1; ở cuối tệp chứ không phải sau mỗi gói.

11

Thứ ba cuối cùng của Intermediate Perl được dành cho việc tạo mô-đun.

Bất cứ khi nào bạn muốn biết làm thế nào để làm điều gì đó trong Perl, kiểm tra perltoc, mục lục cho tài liệu Perl:

% perldoc perltoc 

Một số bộ phận của lõi giấy tờ Perl có thể giúp bạn:

Chúc may mắn,

5

Cách truyền thống nhất thiết lập một mô-đun được như sau:

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. 

và như othe rs đã nói, bạn có thể sử dụng nó như vậy:

use Foo::Bar; 
2

h2xs -XA -n của bạn :: Mô-đun

h2xs là một tiện ích mà đến như là tiêu chuẩn với perl, dành cho hỗ trợ trong việc xây dựng các module liên kết bao gồm liên kết C tiêu đề/mã, nhưng có thể được sử dụng để xây dựng một bộ xương hoàn chỉnh của một mô-đun perl tinh khiết (với cờ -XA), bao gồm những thứ như thư mục kiểm tra, tệp README, Makefile và Tệp kê khai. (một bài viết hay phác thảo chi tiết ở đây: http://perltraining.com.au/tips/2005-09-26.html)

Đó là trường cũ, nhưng đáng xem ngay cả khi chỉ cho tất cả lời nhắc nó giúp bạn hiểu mọi thứ đúng (kiểm tra, tài liệu, số phiên bản, xuất và danh sách export_ok, tất cả nội dung dễ quên ...)

Bạn sẽ kết thúc với tệp "Module.pm" bên trong thư mục "My" (từ "My :: Module") như thế này:

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 
2
cpanm Module::Starter::PBP 
perl -MModule::Starter::PBP=setup 
module-starter --module=My::Module 
+0

Chính xác những gì tôi đã tìm kiếm, cảm ơn rất nhiều :) – Thanos

Các vấn đề liên quan