2012-03-01 48 views
6

Tôi có một tập lệnh perl đang sử dụng đường dẫn tệp tương đối.đường dẫn tệp tương đối trong perl

Đường dẫn tương đối dường như liên quan đến vị trí mà tập lệnh được thực thi thay vì vị trí của tập lệnh perl. Làm cách nào để tạo các đường dẫn tương đối của tôi liên quan đến vị trí của tập lệnh?

Ví dụ tôi có một cấu trúc thư mục

dataFileToRead.txt 
->bin 
    myPerlScript.pl 
->output 

bên trong kịch bản perl tôi mở dataFileToRead.txt sử dụng mã của tôi $ rawDataName = "../dataFileToRead.txt"; mở INPUT, "<", $ rawDataName;

Nếu tôi chạy kịch bản perl từ thư mục bin sau đó nó hoạt động tốt

Nếu tôi chạy nó từ thư mục cha sau đó nó không thể mở các tập tin dữ liệu.

Trả lời

13

FindBin sự là giải pháp cổ điển để vấn đề của bạn. Nếu bạn viết

use FindBin; 

thì vô hướng $FindBin::Bin là đường dẫn tuyệt đối đến vị trí tập lệnh Perl của bạn. Bạn có thể chdir đó trước khi bạn mở các tập tin dữ liệu, hoặc chỉ sử dụng nó trong đường dẫn đến tập tin bạn muốn mở

my $rawDataName = "$FindBin::Bin/../dataFileToRead.txt"; 
open my $in, "<", $rawDataName; 

(Bằng cách này, nó luôn luôn là tốt hơn để sử dụng từ vựng tập tin xử lý trên bất cứ điều gì nhưng một . perl rất cũ)

+0

https://encrypted.google.com/search?q=findbin+site:use .perl.org – daxim

+0

@daxim: c của bạn omment có lẽ là câu thần chú * FindBin bị hỏng *. Tôi biết về điều này, nhưng không thể dễ dàng tìm thấy một lời giải thích, một ví dụ về sự thất bại của nó liên quan đến câu hỏi này, hoặc một mô-đun thay thế. Có lẽ bạn có thể giúp chúng tôi? – Borodin

+0

Liên kết trực tiếp: [FindBin bị hỏng] (http://www.perlmonks.org/?node_id=41213) (cố định trong lõi kể từ giữa năm 2011); [FindBin dường như nghĩ rằng nó cần thiết để đi bộ toàn bộ con đường] (http://use.perl.org/comments.pl?sid=36400&cid=56760); [mã thay thế] (http://use.perl.org/~Aristotle/journal/33996) hoặc có lẽ FindBin :: Real hoặc lib :: abs.Tôi không bao giờ có mong muốn làm điều này so sánh bởi vì tôi không bao giờ cần FindBin hoặc chức năng tương đương bởi vì tôi biết về bao bì và tính năng chia sẻ dir. – daxim

0

Đường dẫn tương đối có liên quan đến working directory hiện tại. Nếu bạn không có bất kỳ quyền kiểm soát nào đối với thư mục hoạt động thì bạn cần tìm một cách mạnh mẽ hơn để xác định đường dẫn tệp của bạn, ví dụ: sử dụng đường dẫn tuyệt đối hoặc các đường dẫn tương đối có liên quan đến một số vị trí cụ thể trong hệ thống tệp.

1

Bắt đầu bằng finding out where the script is.

Sau đó tải thư mục. Bạn có thể sử dụng phương pháp của cho việc này.

Cuối cùng, bạn có thể sử dụng chdir để thay đổi thư mục làm việc hiện tại thành thư mục mà bạn vừa xác định.

Vì vậy, về mặt lý thuyết:

chdir(Path::Class::File->new(abs_path($0))->dir()); 
3

Để bật một đường dẫn tương đối thành một tuyệt đối bạn có thể sử dụng Cwd:

use Cwd qw(realpath); 
print "'$0' is '", realpath($0), "'\n"; 
+0

Tài liệu về Cwd hiện khả dụng ở đây: http://search.cpan.org/~smueller/PathTools-3.47/Cwd.pm –

+1

Tôi đã cập nhật đường dẫn đến tài liệu Cwd thành đường dẫn vĩnh viễn: http: // tìm kiếm .cpan.org/dist/PathTools/Cwd.pm Đường dẫn đó sẽ luôn là mới nhất, ngay cả khi phiên bản thay đổi hoặc thậm chí là chủ sở hữu. –

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