2010-04-07 22 views
5

Tôi sử dụng use lib "./DIR" để lấy thư viện từ thư mục ở nơi khác. Tuy nhiên, nó dường như không hoạt động trên máy chủ của tôi, nhưng nó hoạt động tốt trên máy tính để bàn cục bộ của tôi. Bất kỳ lý do cụ thể nào?Pragma lib của Perl hoạt động như thế nào?

Và một câu hỏi nữa, không use lib được truyền trong một số mô-đun?

Hai trường hợp: Giả sử tôi tạo một lớp cơ sở yêu cầu một vài thư viện, nhưng tôi biết rằng nó cần phải được mở rộng và lớp mở rộng sẽ cần phải sử dụng một thư viện khác. Tôi có thể đặt lệnh use lib trong lớp cơ sở không? hoặc tôi sẽ cần phải đặt nó trong mỗi lớp học mở rộng?

Cuối cùng, tôi có thể chỉ có một gói use package trong đó gói chứa một nhóm sử dụng lib, nó sẽ tuyên truyền các câu lệnh lib sử dụng cho mô-đun hiện tại của tôi không? < - Tôi không nghĩ vậy, nhưng yêu cầu anyways

Trả lời

3

. trong câu lệnh use lib có nghĩa là "thư mục làm việc hiện tại" và sẽ chỉ hoạt động khi tập lệnh của bạn được chạy từ đúng thư mục. Ý tưởng của máy chủ về cwd có lẽ là một cái gì đó khác (hoặc không xác định). Giả sử rằng các thư mục thư viện được đồng vị trí với với kịch bản và tư nhân để nó, bạn muốn làm một cái gì đó như thế này thay vì:

use FindBin; 
use lib "$FindBin::Bin/DIR"; 

Một tuyên bố use lib ảnh hưởng @INC - danh sách các địa điểm perl tìm kiếm khi bạn use hoặc require một mô-đun. Nó ảnh hưởng toàn cầu đến phiên bản hiện tại của thông dịch viên. Bạn thực sự chỉ nên đặt câu lệnh use lib trong tập lệnh chứ không phải trong mô-đun.

Về nguyên tắc, bạn có thể có một package MyLibs đó bao gồm một loạt các use lib báo cáo và sau đó use MyLibs trước khi sử dụng bất kỳ gói trong những địa điểm đó, nhưng tôi sẽ không khuyên bạn nên nó.

+0

Tôi đã sử dụng getcwd để tìm ra vị trí "." Là. Chỉ cần tò mò để biết nếu nó có thể tìm ra nơi kịch bản perl nằm? Nó không hoạt động khi tôi cố gắng sử dụng FindBin vì lib và bin không được đặt cùng vị trí. Đây là một ví dụ về những gì tôi đang cố gắng làm. Tôi chạy kịch bản perl từ thư mục nói 1. Nó có sử dụng lib "/ abs/path/topack /"; sử dụng gói. Trong gói tôi sử dụng lib './FOLDER2'; giả sử cwd sẽ giống nhau. Kể từ "." đang trỏ đến Folder1 chứ không phải đường dẫn. Điều đó là sai. Làm thế nào để tôi không sử dụng đường dẫn tuyệt đối trong gói nhưng cũng có thể sử dụng.? Có thể không? – Tyug

+0

@Tyug: Bạn có thể xác định vị trí mô-đun được tải bằng cách kiểm tra '% INC'. Xem http://stackoverflow.com/questions/1463414 cho một câu hỏi tương tự sẽ giúp bạn chỉ đúng hướng. –

+0

Cảm ơn bạn rất nhiều! – Tyug

2

Không có cách nào để biết tại sao nó không hoạt động trên máy chủ của bạn mà không có thêm thông tin. Đặc biệt, kiểm tra nhật ký lỗi máy chủ của bạn và đổ @INC ở đâu đó nếu cần và so sánh với đường dẫn thư viện thực tế của bạn.

use lib sửa đổi @INC, toàn cầu, miễn là bạn thực thi use lib trước khi các gói khác cố gắng bao gồm nội dung, nó sẽ hoạt động và tất cả các gói khác sẽ thấy đường dẫn mới bao gồm.

Để biết thêm chi tiết về @INC, hãy xem mục nhập của nó trong perlvar.

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