2009-09-20 39 views
14

Tôi có một loạt các tệp Perl chứa một số hằng số tên tệp. Tôi muốn định nghĩa chúng trong một tập tin riêng biệt - một cái gì đó giống như một tập tin tiêu đề trong C. Cách tốt nhất/tiêu chuẩn nhất để làm điều này trong Perl là gì?Làm cách nào để xác định các hằng số trong một tệp riêng biệt trong Perl?

+2

Rất gần trùng lặp với câu hỏi này: http://stackoverflow.com/questions/193020/how-do-i-use-constants-from-a-perl-module – draegtun

Trả lời

16

Không có tương đương với tệp tiêu đề C trong Perl. Để khai báo và xác định các hằng số toàn cầu, bạn có thể sử dụng define pragma. Tôi không có kinh nghiệm với mô-đun này mặc dù giao diện có vẻ hợp lý.

Mặt khác, bạn có thể viết mô-đun nơi bạn xác định các hằng số và nhập chúng vào mô-đun của mình bằng cách sử dụng use. Ví dụ:

package MyConstants; 

use strict; use warnings; 

use Exporter qw(import); 
use Const::Fast; 

our @EXPORT = qw(); 
our @EXPORT_OK = qw($X $Y); 

const our $X => 'this is X'; 
const our $Y => 'this is Y'; 

__PACKAGE__; 
__END__ 

Sau đó bạn có thể sử dụng module này như sau:

#!/usr/bin/perl 

use strict; use warnings; 

use MyConstants qw($X); 

print "$X\n"; 
print "$MyConstants::Y\n"; 

Nếu bạn là OK với việc sử dụng tên biến đầy đủ (ví dụ $MyConstants::Y), bạn không cần phải Exporter ở tất cả.

Ngoài ra, hãy chắc chắn rằng các biến bạn xuất không thể sửa đổi ở nơi khác (xem chú ý trong tài liệu Exporter).

Tất nhiên, bạn cũng có thể xác định các hằng số bằng cách sử dụng constant.pm. Nó có thể nhanh hơn để sử dụng các hằng số như vậy, nhưng chúng rất khó xử nếu bạn cần phải nội suy chúng trong một chuỗi.

+3

Readonly :: Scalar cũng khá nhanh nếu bạn đã cài đặt Readonly :: XS. Hashes and Arrays vẫn chậm hơn. –

+1

Lưu ý rằng các tài liệu xuất khẩu (http://perldoc.perl.org/Exporter.html) khuyên bạn KHÔNG nên xuất các biến, mặc dù nó cho phép bạn. –

+2

@Robert P, IMO xuất một biến theo yêu cầu là hợp lý, việc xuất một (hoặc nhiều hơn!) Theo mặc định là tốt nhất nên tránh. Nếu trong ví dụ trên, tôi đã mong đợi sử dụng X nhiều lần, nhiều lần và muốn tránh sự lặp lại không cần thiết của việc gõ '$ MyConstants :: X' ở khắp mọi nơi, nó sẽ là một lợi ích rất lớn. Một trường hợp khác cho các biến được nhập là nếu tôi vô tình cố gắng sử dụng '$ MyConstants :: x', không có thông báo lỗi được tạo ra nghiêm ngặt sẽ cảnh báo lỗi của tôi, trong khi, nếu tôi nhập' $ X' và cố gắng sử dụng '$ x', tiết kiệm nghiêm ngặt trong ngày bằng cách bắt lỗi. – daotoad

-2

Một cách là viết chúng dưới dạng mô-đun perl, sau đó bạn có thể bao gồm "yêu cầu" hoặc "sử dụng". Bạn muốn viết tập tin của bạn như thế này - cung cấp cho nó một phần mở rộng .pm (ví dụ, myFabulousPackage.pm)

package myFabulousPackage; 

$someSetting=45; 
$otherSetting='Fish'; 

1; 

Sau đó, trong kịch bản perl của bạn, điều này sẽ bao gồm các tập tin và sau đó tham khảo $ otherSetting:

#!/usr/bin/perl 

use myFabulousPackage; 

print $myFabulousPackage::otherSetting; 

Đây chỉ là một cái nhìn rất đơn giản về những gì bạn có thể làm với một gói/mô-đun, nhưng đối với những gì bạn cần, đây có thể là cách đơn giản nhất để thực hiện nó. Tương tự, bạn cũng có thể đặt các gói con trong gói và tham khảo chúng theo cách tương tự.

+3

Điều này sẽ không hoạt động. Các biến được khai báo với các biến (từ vựng) của tôi không thể truy cập thông qua '$ PackageName :: varname'. Cú pháp này chỉ truy cập các biến trong bảng biểu tượng. Cách tốt nhất để đặt các biến trong bảng biểu tượng là sử dụng 'our' để khai báo chúng. – daotoad

+1

Điều đó sẽ không thực sự hiệu quả.Khai báo 'my' của các biến làm cho chúng bị lốm đốm một cách lố bịch, và do đó chỉ hiển thị với mã trong tệp' .pm'. Bạn muốn chúng được khai báo với 'our' thay thế. Ngoài ra, bạn nên luôn luôn chấm dứt các tệp mô-đun bằng '1;' vì nếu câu lệnh cuối cùng bằng cách nào đó đánh giá thành giá trị sai, mô-đun sẽ không tải. – arnsholt

+0

Đúng - bạn đúng về 'của tôi' ... đó là tôi đang viết perl về phi công tự động, và không kiểm tra kỹ các ví dụ của tôi. Edit'd. –

7

Chúng tôi thường làm điều này với một tên mô-đun Các hằng số. Một cái gì đó như:

package MyPackage::Constants; 

our $DIR = "/home/chriss"; 
our $MAX_FILES = 5; 

1; 

Sau đó, để sử dụng nó:

package MyPackage; 
use MyPackage::Constants; 

open(my $fh, ">", $MyPackage::Constants::DIR . "/file"); 

Nếu bạn không muốn tham khảo các gói tất cả các thời gian, bạn có thể sử dụng xuất khẩu và mang lại tất cả những biểu tượng mà bạn muốn.

+3

Tại sao không xác định các hằng số MyPackage trong mô-đun MyPackage, thay vì tạo một không gian tên mới? Và nếu bạn tham chiếu đến hằng số như không gian tên :: DIR, bạn sẽ mất lợi thế của thừa kế, tức là MyPackage :: Child :: Hằng số không thể kế thừa từ MyPackage :: Constants và ghi đè giá trị của DIR. namespace-> DIR tốt hơn nhiều. – Ether

+1

Đây là một ví dụ đơn giản cho mục đích minh họa. Điều đó nói rằng, không phải tất cả mọi thứ là OO :) –

+4

Điều đó có vẻ như cấu hình, không phải hằng số. –

5

Điều này giống như cài đặt cấu hình, tốt hơn nên đặt trong tệp cấu hình mà bạn phân tích cú pháp bằng một trong các mô-đun CPAN khác nhau, ví dụ: Config::Any.

Cấu hình là dữ liệu mà IMO không nên có trong mã của bạn.

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