2010-03-29 31 views
9

Như tiêu đề nói, tôi không rõ ràng khi nào một chương trình con sẽ được gọi. Từ trang require tại perldoc, người ta có thể viết:Khi nào là tham chiếu chương trình con trong @INC được gọi?

push @INC, \&my_sub; 
sub my_sub { 
    my ($coderef, $filename) = @_; # $coderef is \&my_sub 
    ... 
} 

nhưng điều này chính xác? Gói yêu cầu hoặc tập lệnh yêu cầu (hoặc gói)? Tôi đã thử cả hai với một số tuyên bố print sentinel nhưng không làm việc như vậy rõ ràng có cái gì đó tôi không nhận được.

Trả lời

12

Perl gọi tham chiếu chương trình con trong @INC khi nó đang di chuyển ngang qua @INC để tìm mô-đun. Tức là, bạn sẽ kích hoạt nó khi bạn cố tải mô-đun với use hoặc require và Perl không tìm thấy mô-đun đó ở các vị trí @INC trước đó.

BEGIN { 
    push @INC, 
     sub { print "Oops: There was an error looking for $_[1]\n"; }; 
    } 

eval "use Cat::Burglar"; 
eval "use Local::NotThere"; 
require Cat::Burglar; 

Bạn cần đảm bảo rằng tham chiếu chương trình con của bạn nằm trong @INC trước khi bạn cố tải mô-đun. Hãy nhớ rằng use là một tính năng thời gian biên dịch và rằng require là tính năng thời gian chạy. Như với việc thêm các mục nhập "thường xuyên" @INC khác, bạn có thể muốn thực hiện việc đó trong khối BEGIN càng sớm càng tốt trong chương trình của bạn.

+1

Wow, bằng cách nào đó tôi đã đọc tài liệu 'require()' nhiều lần mà không nhận thấy tính năng này! – Ether

+1

Tôi không biết tài liệu bằng trái tim. Tôi chỉ biết làm thế nào để google. –

1

Để tránh gây nhầm lẫn chương trình con của chúng tôi với các chương trình con trong mô-đun Perl tiêu chuẩn nói chung là tốt để sử dụng unshift thay vì push. Vì vậy, trước tiên nó sẽ sử dụng chương trình con của bạn từ @INC.

+0

Tôi nghĩ rằng nên đọc một cái gì đó như "Để * thích * thói quen phụ của chúng tôi với các mô-đun tải các mô-đun perl tiêu chuẩn" – justintime

+0

Vâng! Bạn là chính xác justintime. Xin lỗi cho tiếng Anh của tôi – thillaiselvan

+1

Hoạt động mảng nào bạn sử dụng tùy thuộc vào những gì bạn đang làm và khi bạn muốn tham chiếu mã kích hoạt. unshift đặt nó ở phía trước của mảng, đẩy vào cuối, và mối nối sẽ đặt nó ở bất kỳ vị trí nào bạn muốn. Đó là nhiệm vụ phụ thuộc mặc dù. –

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