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?
Trả lời
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.
Readonly :: Scalar cũng khá nhanh nếu bạn đã cài đặt Readonly :: XS. Hashes and Arrays vẫn chậm hơn. –
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. –
@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
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ự.
Đ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
Đ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
Đú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. –
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.
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
Đâ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 :) –
Điều đó có vẻ như cấu hình, không phải hằng số. –
Đ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.
- 1. Làm cách nào để phân biệt hai tệp trong Perl?
- 2. Làm cách nào để chỉ ghi một số dòng nhất định của một tệp trong Perl?
- 3. Làm cách nào để kiểm tra các hằng số được xác định trong PHP?
- 4. Lỗi xác định hằng số trong Delphi
- 5. Xác định hằng số lớp trong PHP
- 6. Tại sao 'được xác định() || xác định 'cú pháp trong việc xác định một hằng số
- 7. Làm cách nào để nhập các hằng số vào nhiều mô-đun trong Perl?
- 8. Làm cách nào để xác định hằng số chuỗi trong C++?
- 9. Làm thế nào để xác định một hằng số bằng cách sử dụng một số khác trong một lớp Matlab
- 10. Xác định các hằng số quá tải trong Isabelle
- 11. Làm cách nào để tạo một băm lồng nhau dưới dạng hằng số trong Perl?
- 12. Làm cách nào để tạo các hằng số lớp riêng trong Ruby
- 13. Làm cách nào để sử dụng các hằng số từ mô-đun Perl?
- 14. Làm thế nào để tôi tìm được một hằng số được xác định trong Ruby?
- 15. Cách xác định hằng số thành viên loại trong F #?
- 16. Xác định lại các hằng số trong PHP
- 17. Làm thế nào để xác định đúng hằng
- 18. Cách tắt cảnh báo để xác định lại một hằng số khi tải tệp
- 19. Làm thế nào để xác định lại một hằng số Ruby mà không cần cảnh báo?
- 20. Làm cách nào để xử lý các ký tự đặc biệt trong một regex Perl?
- 21. Xác định hằng số ứng dụng trong Codeigniter
- 22. Cách tạo tệp hằng số trong Javascript?
- 23. Làm cách nào để lưu tệp vào đĩa cứng trong một chuỗi riêng biệt?
- 24. Module.private_constant làm gì? Có cách nào để chỉ liệt kê các hằng số riêng tư không?
- 25. Làm thế nào để xác định một hằng số là một byte hoặc ngắn?
- 26. Làm cách nào để xóa một tệp trong Perl?
- 27. Làm thế nào để xác định một `từ ... import * 'api riêng biệt từ __all__ trong một mô-đun?
- 28. Làm thế nào để chuyển đổi một chuỗi số clojure thành các số nguyên riêng biệt?
- 29. Tôi làm cách nào để có được số lượng trang trong một tệp PDF trong Perl?
- 30. Xác định Mô hình Mongoose trong Mô-đun riêng biệt
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