2008-10-10 26 views
37

Nếu tôi xác định một hằng số trong một mô-đun Perl, làm cách nào để sử dụng hằng số đó trong chương trình chính của tôi? (Hoặc làm cách nào để gọi hằng số đó trong chương trình chính?)Làm cách nào để sử dụng các hằng số từ mô-đun Perl?

+0

Cách tốt nhất để tránh gói "không đổi". http://earino.wordpress.com/2013/02/27/use-constant-will-surprise-you-with-its-evil/ Các giải pháp thay thế tại đây: http://neilb.org/reviews/constants.html – nslntmnx

Trả lời

45

Có thể xuất các hằng số giống như các biểu tượng gói khác. Sử dụng Exporter mô-đun tiêu chuẩn, bạn có thể xuất hằng từ một gói phần mềm như thế này:

package Foo; 
use strict; 
use warnings; 

use base 'Exporter'; 

use constant CONST => 42; 

our @EXPORT_OK = ('CONST'); 

1; 

Sau đó, trong một kịch bản khách hàng (hoặc mô-đun khác)

use Foo 'CONST'; 
print CONST; 

Bạn có thể sử dụng %EXPORT_TAGS băm (xem Tài liệu của nhà xuất khẩu) để xác định các nhóm hằng số có thể được xuất với một đối số nhập duy nhất.

Cập nhật: Dưới đây là ví dụ về cách sử dụng tính năng %EXPORT_TAGS nếu bạn có nhiều hằng số.

use constant LARRY => 42; 
use constant CURLY => 43; 
use constant MOE => 44; 

our @EXPORT_OK = ('LARRY', 'CURLY', 'MOE'); 
our %EXPORT_TAGS = (stooges => [ 'LARRY', 'CURLY', 'MOE' ]); 

Sau đó, bạn có thể nói

use Foo ':stooges'; 
print "$_\n" for LARRY, CURLY, MOE; 
+0

sử dụng Xuất khẩu 'nhập khẩu'; là tốt hơn, nhưng sẽ yêu cầu nâng cấp Trình xuất trên perl sớm hơn 5.8.3. –

+3

hãy giải thích lý do tại sao sử dụng 'nhập' tốt hơn? –

+0

Cách tốt nhất để tránh gói "không đổi". http://earino.wordpress.com/2013/02/27/use-constant-will-surprise-you-with-its-evil/ Các giải pháp thay thế tại đây: http://neilb.org/reviews/constants.html – nslntmnx

24

Constants chỉ là tàu ngầm với nguyên mẫu trống, vì vậy họ có thể được xuất khẩu giống như bất kỳ phụ khác.

# file Foo.pm 
package Foo; 
use constant BAR => 123; 
use Exporter qw(import); 
our @EXPORT_OK = qw(BAR); 


# file main.pl: 
use Foo qw(BAR); 
print BAR; 
21

Để mở rộng trên các câu trả lời trước đó, vì hằng số thực sự chỉ là tàu ngầm, bạn có thể cũng gọi cho họ trực tiếp:

use Foo; 
print Foo::BAR; 
+5

Không tham khảo câu trả lời như ở trên, bởi vì nếu câu trả lời của bạn được bỏ phiếu đủ, nó có thể kết thúc ở trên chúng. –

17

Bạn có thể muốn xem xét sử dụng Readonly thay vì liên tục.

+0

Tại sao? Có gì sai với hằng số? – moritz

+1

Bạn không thể làm điều này với nó: in "hằng số là $ hằng số"; hoặc điều này: in $ hash {constant}; –

+2

Vì 'hằng số sử dụng' tạo ra một chương trình con, có những vấn đề không mong muốn => không có nội suy chuỗi, khó sử dụng như một khóa băm. Xem tài liệu cho chỉ đọc [https://metacpan.org/module/Readonly#COMPARISON-WITH-use-constant]. Chỉ đọc sử dụng nội bộ perl để đánh dấu trực tiếp một biến là chỉ đọc. Chỉ đọc chậm (trừ khi sử dụng Readonly :: XS) và không được duy trì.Xem thêm Dữ liệu :: Khóa và Const :: Nhanh để triển khai khác nhau. – spazm

8
package Foo; 
use Readonly; 
Readonly my $C1 => 'const1'; 
Readonly our $C2 => 'const2'; 
sub get_c1 { return $C1 } 
1; 

perl -MFoo -e 'print "$_\n" for Foo->get_c1, $Foo::C2' 
6

Để thêm vào túi thủ thuật, vì hằng số chỉ là một chương trình con, bạn thậm chí có thể gọi nó là phương thức lớp.

package Foo; 
use constant PI => 3.14; 

print Foo->PI; 

Nếu bạn có nhiều hằng số, đây là cách tốt nhất để truy cập thường xuyên mà không phải xuất tất cả. Tuy nhiên, không giống như Foo::PI hoặc xuất PI, Perl sẽ không biên dịch Foo->PI do đó bạn phải chịu chi phí của một cuộc gọi phương thức (có thể không quan trọng).

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