2009-11-17 22 views
21

Tôi khá chắc chắn rằng tôi đã đọc một nơi nào đó mà có thể, nhưng có một vài gotchas mà bạn cần phải nhận thức được. Thật không may, tôi không thể tìm thấy hướng dẫn hoặc trang mô tả những gì bạn cần làm. Tôi nhìn qua Perl tutorials, và không tìm thấy cái mà tôi nhớ đọc. Ai đó có thể chỉ cho tôi một trang hoặc tài liệu mô tả cách đặt nhiều gói vào một tệp .pm duy nhất không?Trong Perl, làm cách nào để đặt nhiều gói trong một tệp .pm?

Trả lời

16

Bạn chỉ cần bắt đầu gói mới với một câu lệnh package:

package PackageOne; 

# ...... code 

package PackageTwo; 

# .... more code 

Problems with this approach (archived on 2009)

+0

Tôi khá chắc chắn trong bài viết mà tôi đã đọc, có một vài điều khác mà bạn phải làm hoặc các vấn đề có thể xuất hiện với phạm vi. –

+1

tất nhiên sẽ có vấn đề phạm vi và đó là lý do tại sao nó không được khuyến khích, hãy xem liên kết tôi đã thêm vào. – ennuikiller

+4

Bạn chỉ có thể 'sử dụng' một gói có tên tương ứng với tên tệp và bạn chỉ có thể (dễ dàng) 'sử dụng' một tệp chứa gói tương ứng với tên của nó. Khác hơn thế và thực tế là từ vựng tập tin phạm vi sẽ "rò rỉ" vào gói tiếp theo (tránh được bằng cách thêm niềng răng) không có nhiều điều cần biết. – hobbs

4

Làm thế nào để làm điều đó: chỉ cần ban hành nhiều package hướng dẫn.

Gotchas Tôi có thể nghĩ: my biến không phải là gói bản địa hóa, vì vậy chúng vẫn được chia sẻ. Trước khi bạn phát hành, bạn đang ở trong gói main theo mặc định.

30

Đây là cách tôi thường làm điều đó:

use strict; 
use warnings; 
use 5.010; 

{ 
    package A; 
    sub new { my $class = shift; bless \$class => $class } 
    sub hello { say 'hello from A' } 
} 

{ 
    package B; 
    use Data::Dumper; 
    sub new { my $class = shift; bless { @_ } => $class } 
    sub hello { say 'Hello from B + ' . shift->dump  } 
    sub dump { Dumper $_[0] } 
} 

$_->hello for A->new, B->new(foo => 'bar'); 
+0

Phạm vi khối tốt cho điều gì nếu gói định nghĩa phạm vi riêng của nó? – ceving

+1

@ceving - Vì lý do tương tự mà 'gói' đã được thay đổi ở mức 5.14 perl bây giờ cho phép cú pháp sau:' package A {...} '. NB. Điều này giống như '{package A; ...} '). Điều này tránh * gotchas * bạn có thể nhận được với những thứ như 'my' &' our'. ref: http://perldoc.perl.org/5.14.0/functions/package.html – draegtun

2

Đây là những gì làm việc cho tôi:

#!/usr/bin/perl 

use strict; 
use warnings; 

{ 
    package A; 
    use Exporter; 
    our @ISA = qw(Exporter); 
    our @EXPORT_OK = qw(a_sub); 
    our @EXPORT = qw(a_sub); 

    sub a_sub { 
     # your code ... 
    } 
} 
{ 
    package B; 
    use Exporter; 
    our @ISA = qw(Exporter); 
    our @EXPORT_OK = qw(b_sub); 
    our @EXPORT = qw(b_sub); 

    sub b_sub { 
     # your code ... 
    } 
} 

# Main code starts here ############## 

use boolean; 
use Data::Dumper; 

import A qw(a_sub); 
import B qw(b_sub); 

a_sub(); 
b_sub(); 

Điểm quan trọng là thay vì sử dụng "sử dụng", bạn thay đổi nó cho " nhập khẩu "(theo cách đó nó sẽ không đi và cố gắng tìm tập tin).

+0

Cách tiếp cận của tôi tương tự, tôi chỉ thay đổi '{package A; ...} 'đến' gói A {...} '. –

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