2016-09-22 13 views
7
use WWW::Mechanize; 
$mech = new WWW::Mechanize; 
$mech->get("http://www.google.com"); 
$html = HTML::TreeBuilder::XPath->new_from_content($mech->content); 
sub test 
{ 
    use HTML::TreeBuilder::XPath; 
} 

Mã trên biên dịch, do đó, câu lệnh use trong sub đang được áp dụng trên toàn cầu.Tại sao tuyên bố sử dụng trong phụ áp dụng trên toàn cầu?

Tại sao perl làm việc này? Nó không có ý nghĩa gì cả.

Trả lời

4

Đây là những gì perldoc trạng thái:

use có hiệu lực tại thời gian biên dịch, nó không tôn trọng sự kiểm soát dòng chảy bình thường của mã đang được biên soạn. Đặc biệt, việc sử dụng bên trong nhánh giả của một điều kiện không ngăn cản nó được xử lý.

Thật không may nó không đưa ra lời giải thích lý do tại sao nó được thiết kế theo cách đó. Lý do có thể là:

  • Perl cung cấp cho bạn rất nhiều về sự tự do trong nhiều trường hợp (TIMTOWTDI)
  • use bên trong một chương trình con có thể hiển thị ý định của bạn mà bạn thực sự muốn sử dụng một mô-đun duy nhất tại một nơi cụ thể (ngay cả khi nó được nạp trên toàn cầu)
  • Nếu bạn (lại) di chuyển một chương trình con đặc biệt (trong đó có một use) sau đó, bạn không cần phải lo lắng về việc loại bỏ không sử dụng use 's từ các nơi khác như phía trên cùng của kịch bản của bạn
  • . ..

Mặc dù những ý tưởng này có vẻ hợp lý, tôi sẽ tránh tải các mô-đun trong chương trình con vì nó rõ ràng hơn để có tất cả chúng ở một vị trí thay vì nằm rải rác khắp nơi?

6

use Module; có hai hiệu ứng.

Đầu tiên là tải mô-đun. Rõ ràng, điều đó có ảnh hưởng toàn cầu. Người ta sẽ không muốn một mô-đun được nạp nhiều lần nếu nhiều hơn một mô-đun khác sử dụng nó.

Cách thứ hai là gọi phương thức import của mô-đun. Đối với hầu hết các mô-đun, điều này phục vụ xuất khẩu các ký hiệu vào không gian tên của người gọi để các chức năng đó có thể được gọi mà không đủ điều kiện chúng với tên gói đầy đủ. Điều này rõ ràng ảnh hưởng đến nhiều hơn chỉ là một số phụ kể từ khi không ai cung cấp cho mỗi tiểu không gian tên riêng của nó. Nhưng điều đó thực sự tùy thuộc vào bạn.

Một số phương thức của mô-đun import, tuy nhiên, hãy làm điều gì đó hoàn toàn khác. Chúng thay đổi cách mã được biên dịch trong phạm vi từ vựng trong đó có chỉ thị. Chúng được gọi là pragmas. use strict; là ví dụ về một. Nó có ý nghĩa để sử dụng các mô-đun trong một phụ. Tuy nhiên, việc sử dụng use HTML::TreeBuilder::XPath; trong một phụ không có ý nghĩa gì.

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