2009-02-08 26 views
5

Tôi đang viết một ứng dụng trong Perl với một số mô-đun. Tôi muốn viết một số hằng số toàn cầu sẽ được hiển thị từ khắp mọi nơi, như thế này:Làm cách nào để nhập các hằng số vào nhiều mô-đun trong Perl?

#Constants.pm 
$h0 = 0; 
$scale = 20; 

Và sau đó sử dụng chúng mà không đủ điều kiện với main:: hoặc Constants:: trong một số mô-đun. Tuy nhiên, nếu tôi viết use Constants; trong nhiều hơn một mô-đun, chúng chỉ được nhập vào một không gian tên. Có cách nào để khắc phục điều này?

Tôi đang sử dụng ActivePerl mới nhất.

Trả lời

2

Bạn có thể đặt này ở đầu Constants.pm:

package main; 

Trong trường hợp này tất cả các biến bạn xác định sẽ nằm trong main namespace:

$main::x 

hoặc nếu bạn đang cảm thấy dũng cảm :

package; 

Trong trường hợp này tất cả các biến bạn xác định bệnh được trong một namespace trống:

$::x 

Lưu ý rằng việc sử dụng package với không gian tên không được khuyến khích, và dường như sẽ hết hạn vào một số phiên bản của Perl. Xem báo giá bên dưới.


Trích dẫn từ man perlfunc:

 

     package NAMESPACE 
     package Declares the compilation unit as being in the given 
       namespace. The scope of the package declaration is 
       from the declaration itself through the end of the 
       enclosing block, file, or eval (the same as the "my" 
       operator). All further unqualified dynamic identifiers 
       will be in this namespace. A package statement affects 
       only dynamic variables--including those you've used 
       "local" on--but not lexical variables, which are cre? 
       ated with "my". Typically it would be the first decla? 
       ration in a file to be included by the "require" or 
       "use" operator. You can switch into a package in more 
       than one place; it merely influences which symbol table 
       is used by the compiler for the rest of that block. 
       You can refer to variables and filehandles in other 
       packages by prefixing the identifier with the package 
       name and a double colon: $Package::Variable. If the 
       package name is null, the "main" package as assumed. 
       That is, $::sail is equivalent to $main::sail (as well 
       as to $main'sail, still seen in older code). 

       If NAMESPACE is omitted, then there is no current pack? 
       age, and all identifiers must be fully qualified or 
       lexicals. However, you are strongly advised not to 
       make use of this feature. Its use can cause unexpected 
       behaviour, even crashing some versions of Perl. It is 
       deprecated, and will be removed from a future release. 


Edit: Câu hỏi này có thể hữu ích cũng như: How do I use constants from a Perl module?

+0

Cảm ơn. Những gì tôi thực sự cần là phần về bỏ "chính". – Lev

+0

Tôi tò mò nếu nó thực sự hoạt động. Nếu có, tôi sẽ xóa tuyên bố từ chối trách nhiệm ở đầu câu trả lời. –

+1

Điều này đặt các hằng số trong chính ::, nhưng bây giờ bạn phải tiền tố tất cả các hằng số với chính :: –

7

Check-out Exporter và trang perlmod người đàn ông.

5

Đừng nói với bất cứ ai tôi đã nói với bạn điều này, nhưng các biến đặc biệt của Perl là khả dụng ở mọi nơi. Bạn có thể nhận thấy rằng đây không công việc:

{ package Foo; 
our $global = 42; } 

{ package Bar; 
say "global is $global"; } 

Đó là bởi vì $global là thực sự gọi $Foo::global. Bạn cũng có thể nhận thấy rằng "quy tắc" này không áp dụng cho những thứ như @INC, %ENV, $_, v.v. Đó là vì các biến đó luôn là được giả định là trong main.

Nhưng thực tế, đó không chỉ là các biến đó. Toàn bộ glob bị "ép buộc" thành main. Điều đó có nghĩa là bạn có thể viết một cái gì đó như điều này:

{ package Constants; 
    $_{PI} = 3.141592; } 

{ package Foo; 
    say "pi is $_{PI}"; } 

và nó sẽ hoạt động.

(Điều này cũng áp dụng cho $ENV, &INC, vv)

Nếu bạn đã bao giờ làm điều này trong mã thực, tuy nhiên, mong đợi một người nào đó để giết bạn :) Nó là tốt để biết, tuy nhiên, chỉ trong trường hợp bạn thấy ai đó khác làm việc đó.

2

Bạn có thể sử dụng Exporter như thế này:

Trong Constants.pm:

 
#Constants.pm 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw($h0 $scale); 
@EXPORT_OK = qw(myfunc); 

$h0 = 0; 
$scale = 20; 
sub myfunc {...} 

Ghi chú:
* các & trong &myfunc trong mảng @EXPORT là không bắt buộc, và nó được đề nghị bạn làm không sử dụng nó. * Đây sẽ xuất khẩu $h0$scale theo mặc định và & myfunc chỉ nếu nó yêu cầu một cách rõ ràng (xem dưới đây làm thế nào để xác định các ký tự được nhập khẩu bởi module client)

Và sau đó trong các mô-đun mà nhập khẩu Constants.pm và muốn sử dụng $h0, $scale hoặc &myfunc bạn thêm thông tin sau để nhập tất cả các ký hiệu nằm trong @EXPORT trong Constants.pm.

 
#MyModule.pm 
use Constants qw(; 

Nếu bạn muốn chỉ nhập khẩu một số trong những biểu tượng sử dụng:

 
#MyModule.pm 
use Constants qw($h0); 

Và cuối cùng, nếu bạn không muốn nhập khẩu bất kỳ các biểu tượng Constant.pm`s sử dụng:

 
#MyModule.pm 
use Constants(); 
7

Đoạn mã này phải thực hiện chính xác những gì bạn muốn. Gửi tất cả các kudo đến lkundrak.

package Constants; 

use base qw/Exporter/; 

use constant BOB => 666; 
use constant ALICE => 555; 

sub import { 
    no strict "refs"; 

    ${[caller]->[0].'::'}{$_} = ${__PACKAGE__."::"}{$_} 
     foreach grep { not /^(ISA|isa|BEGIN|import|Dumper)$/ } 
      keys %{__PACKAGE__."::"}; 
} 
+0

Thật buồn cười như thế nào đây là câu trả lời duy nhất liên quan đến hằng số (và thậm chí cả câu hỏi không thực sự chạm vào chúng). – Cornelius

+0

điều này đáng lẽ phải là câu trả lời. Làm việc hoàn hảo, cảm ơn! – Ishikawa91

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