Điều này giống như sự khác biệt giữa my
, our
và local
. Sự khác biệt là quan trọng, nhưng bạn nên sử dụng my
99% thời gian.
Perl là ngôn ngữ khá cũ và giòn. Nó đã phát triển trong những năm qua từ một sự kết hợp awk/shell/kitchen sink ngôn ngữ thành một ngôn ngữ mạnh mẽ hơn và mạnh mẽ hơn.
Quay lại Perl 3.x ngày trước khái niệm mô-đun và gói được củng cố, không có khái niệm về mô-đun có không gian tên riêng cho các hàm và biến. Mọi thứ đều có sẵn ở mọi nơi. Không có gì để nhập . Từ khóa use
không tồn tại. Bạn luôn sử dụng require
.
Vào thời điểm Perl 5 xuất hiện, các mô-đun có bộ nhớ riêng cho các tên biến và tên chương trình con. Do đó, tôi có thể sử dụng $total
trong chương trình của mình và mô-đun Foo::Bar
cũng có thể sử dụng $total
vì $total
của tôi thực sự là $main::total
và $total
thực sự là $Foo::Bar::total
.
Xuất là một cách để tạo biến và chương trình con từ mô-đun có sẵn cho chương trình chính của bạn. Bằng cách đó, bạn có thể nói copy($file, $tofile);
thay vì File::Copy::copy($file, $tofile);
.
Từ khóa đơn giản là công cụ tự động cho bạn. Ngoài ra, use
chạy tại thời gian biên dịch trước khi chương trình của bạn được thực thi. Điều này cho phép mô-đun để sử dụng prototyping, vì vậy bạn có thể nói foo(@array)
thay vì foo(\@array)
hoặc munge $file;
thay vì munge($file);
Như nó nói trong trang use perldoc của:
Nó [sử dụng] là chính xác tương đương đến:
BEGIN { require Module; Module->import(LIST); }
Về cơ bản, bạn nên sử dụng use
hơn require
99% thời gian.
Tôi chỉ có thể nghĩ đến một dịp mà bạn cần sử dụng require
trên use
, nhưng đó chỉ là mô phỏng use
. Có những lúc một mô-đun là tùy chọn. Nếu có Foo::Bar
, tôi có thể sử dụng, nhưng nếu không, tôi sẽ không làm như vậy. Sẽ rất tuyệt nếu tôi có thể kiểm tra xem có Foo::Bar
không.
Hãy thử điều này:
eval { use Foo::Bar; };
my $foo_bar_is_available = 1 unless ([email protected]);
Nếu Foo::Bar
không có sẵn, tôi có được điều này:
Can't locate Foo/Bar.pm in @INC (@INC contains:....)
Đó là bởi vì use
xảy ra TRƯỚC KHI tôi có thể chạy eval trên đó. Tuy nhiên, tôi biết cách mô phỏng use
với require
:
BEGIN {
eval { require Foo::Bar; Foo::Bar->import(qw(foo bar barfu)); };
our foo_bar_module_available = 1 unless ([email protected]);
}
Tính năng này hoạt động. bây giờ tôi có thể kiểm tra điều này trong mã của tôi:
our $foo_bar_module_available;
if ($foo_bar_module_available) {
fubar($var, $var2); #I can use it
}
else {
... #Do something else
}
http://stackoverflow.com/questions/2180554/in-perl-is-it-better-to-use-a-module-than-to -require-a-file – devnull
http://stackoverflow.com/questions/1161624/in-perl-what-is-the-difference-between-use-and-require-for-loading-a-module – devnull
http://learn.perl.org/faq/perlfaq8.html#Whats-the-difference-between-require-and-use- – devnull