2013-08-14 14 views
6

Tôi đọc giải thích ngay cả từ perldocStackOverflow. Nhưng có một chút nhầm lẫn.Sự khác biệt giữa sử dụng và yêu cầu (Tôi liệt kê các differnces, cần phải biết những gì khác đang có)

  1. use thường tải các module tại thời gian biên dịch trong khi require làm vào thời gian chạy
  2. use gọi hàm nhập khẩu sẵn có chỉ trong khi require cần phải gọi mô-đun nhập khẩu riêng biệt như

    BEGIN { 
        require ModuleName; 
        ModuleName->import; 
    } 
    
  3. require là được sử dụng nếu thỉnh thoảng chúng tôi muốn tải các mô-đun lớn hơn.

  4. use ném ngoại lệ tại tiểu bang trước khi require không khi tôi gặp vấn đề
  5. Với use chúng ta có thể chọn lọc tải các thủ tục không phải tất cả nhưng ít như

    use Module qw(foo bar) # it will load foo and bar only 
    

là nó có thể ở require cũng?

Beisdes có sự khác biệt nào giữa userequire?

Rất nhiều cuộc thảo luận trên google nhưng tôi hiểu những điểm nêu trên chỉ.
Vui lòng giúp tôi các điểm khác.

+1

http://stackoverflow.com/questions/2180554/in-perl-is-it-better-to-use-a-module-than-to -require-a-file – devnull

+0

http://stackoverflow.com/questions/1161624/in-perl-what-is-the-difference-between-use-and-require-for-loading-a-module – devnull

+3

http://learn.perl.org/faq/perlfaq8.html#Whats-the-difference-between-require-and-use- – devnull

Trả lời

4

Tôi nghĩ rằng mã bạn viết bằng cách riêng của bạn ở điểm thứ hai là tự giải thích về sự khác biệt giữa hai ...

Trên thực tế "sử dụng" thực hiện một "yêu cầu" của các mô-đun và sau đó nó sẽ tự động nhập mô-đun, với "yêu cầu" thay vì mô-đun chỉ bắt buộc phải có mặt nhưng bạn có quyền tự do nhập khẩu khi bạn cần ...

Với những gì đã nêu ở trên, kết quả hiển nhiên là câu hỏi trong điểm 5 không có ý nghĩa, vì "yêu cầu" không nhập bất cứ điều gì, không cần phải xác định phần mô-đun để tải, bạn có thể chọn lọc tải phần bạn cần khi bạn sẽ thực hiện thao tác nhập ...

Hơn nữa nhớ rằng trong khi "sử dụng" hành động tại thời gian biên dịch (Perl biên soạn pha), "đòi hỏi" hành động trong thời gian chạy, vì lý do này với "đòi hỏi" bạn sẽ có thể nhập khẩu các gói chỉ khi và/hoặc khi nó thực sự là cần thiết.

+0

Một câu hỏi: BEGIN { sử dụng Cwd; thư mục $ của chúng tôi = cwd; } sử dụng thư mục lib $; # nó sẽ phân tích cú pháp khối BEGIN trước? Nếu nó là như vậy thì nó có nghĩa là BEGIN khối phân tích cú pháp bắt đầu trước khi biên dịch mã? – Nitesh

+1

@Nitesh: các khối 'use' và' BEGIN' được xử lý theo thứ tự chúng gặp phải. ví dụ: 'sử dụng Đầu tiên; BEGIN {nói "Thứ hai"}; sử dụng Thứ ba; 'sẽ yêu cầu và nhập từ Thứ nhất, sau đó in" Thứ hai ", sau đó yêu cầu và nhập từ Thứ ba. (Điều này là do 'use' nhỏ hơn khối' BEGIN' ẩn.) –

7

Điều này giống như sự khác biệt giữa my, ourlocal. 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ô-đungó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$total của tôi thực sự là $main::total$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 
} 
+1

Ngoài các mô-đun tùy chọn, việc sử dụng chính khác cho 'require' là xử lý các mô-đun tải rất chậm, nhưng không phải lúc nào cũng thực sự cần thiết, để bạn có thể đợi cho đến khi bạn biết bạn có cần hay không trước khi bạn dành thời gian tải nó. –

+4

Điểm tốt. Tuy nhiên, tôi bắt đầu lập trình trên một máy tính chạy trên chip 8085A ở tốc độ 1.5Mz với bộ nhớ 48K. (Và đây là một hệ thống đa người dùng!). Đối với tôi, định nghĩa về sự chậm chạp có một chút khác biệt so với các bạn trẻ whippersnappers. Đối với tôi, chậm chạp có nghĩa là tôi có thể ra ngoài và uống một tách cà phê trong khi đợi chương trình kết thúc. Và, đi ra ngoài cho một tách cà phê có nghĩa là bay trên máy bay đến Ý và nhận được một ly cà phê espresso ngon tại một quán cà phê địa phương, sau đó có thể làm một số cảnh nhìn thấy trước khi trở lại. –

+2

Thực ra 'sử dụng Scalar :: Util 1.0 qw (weaken)' giống như 'BEGIN {yêu cầu Scalar :: Util; Scalar :: Util-> VERSION (1.0); Scalar :: Util-> import (qw (weaken))} 'Chúng ta nên cập nhật tài liệu. –

1

khác biệt giữa việc sử dụng và yêu cầu:

  • Nếu chúng ta sử dụng "sử dụng" không cần phải cung cấp cho phần mở rộng tập tin. Ví dụ: sử dụng server_update_file.
  • Nếu chúng tôi sử dụng "yêu cầu" cần phải cung cấp phần mở rộng tệp. Ví dụ: yêu cầu "server_update_file.pm";
  • phương thức "sử dụng" chỉ được sử dụng cho các mô-đun.
  • phương thức "yêu cầu" được sử dụng cho cả thư viện và mô-đun.

Tham khảo các liên kết để biết thêm thông tin: http://www.perlmonks.org/?node_id=412860

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