2011-12-12 30 views
9

Tôi thực sự nên biết điều này, nhưng tôi đã làm việc chủ yếu với Linux, Mac OS X và Windows mà tất cả đều sử dụng dấu gạch chéo (/) làm phân cách thư mục (Windows có thể sử dụng \ hoặc /.) .Perl Xử lý Directory Separators

Điều đó có nghĩa là khi tôi thường viết chương trình trong Perl, tôi có thể chỉ cần sử dụng / làm dấu tách thư mục và mọi thứ đều ổn. Tuy nhiên, tôi biết rằng File::Spec giả sử cho phép tính di động của các trình phân tách tệp (điều đó có nghĩa là gì).

Nếu tôi đang sử dụng hệ thống không sử dụng dấu gạch chéo chuyển tiếp, tôi hiểu rằng người dùng mong muốn có thể nhập tệp bằng dấu phân cách mặc định và xem đầu ra bằng dấu phân cách mặc định. (Ví dụ, một người dùng Windows sẽ nhập và mong đợi đầu ra là C:\Users\smith\Documents và không phải là C:/Users/smith/Documents), nhưng Perl làm gì trong nội bộ?

Tôi có thể, mặc dù nền tảng có thể sử dụng làm bộ phân cách thư mục hay không, chỉ cần sử dụng dấu gạch chéo ở phía trước khi tôi xử lý tệp trong nội bộ. Ví dụ: tôi có một thư mục $dir và một tệp có tên là $file và tôi muốn mở tệp. Tôi có thể chỉ cần nói $dir/file hoặc tôi có phải sử dụng File::Spec để đặt tên cho tôi không?

Thực tế, các chương trình Perl có yêu cầu dấu gạch chéo chuyển tiếp trong tên thư mục không? Tôi đang viết một mô-đun và sẽ cung cấp tên tệp cho chương trình gọi điện. Tôi có nên cung cấp tệp như /foo/bar/fubar hoặc nếu hệ thống sử dụng dấu hai chấm như hệ điều hành Macintosh đầu tiên, giả sử :foo:bar:fubar?

+3

gì thì bạn sẽ được làm với những con đường? Nếu nó là để đọc và ghi vào các tập tin, sau đó '/' là tốt, và perl sẽ làm những gì bạn có ý nghĩa. Nếu bạn đang tạo các lệnh để được phân tích bằng trình bao lệnh của máy chủ hoặc các chương trình khác trên hệ thống đó, thì bạn sẽ cần phải tuân theo các quy tắc cho nền tảng đó và File :: Spec có thể giúp. –

Trả lời

7

perlport nói gần như mọi thứ có thể nói về chủ đề này. Điều đó nói rằng, các hệ thống không thể chấp nhận / vì bộ tách đường dẫn là rất hiếm và bạn có thể không có nhiều thứ để đạt được từ việc sử dụng số File::Spec một cách trung thực ở khắp mọi nơi. Nhưng cũng phải cẩn thận để phân biệt việc sử dụng nội bộ và bên ngoài của bộ tách thư mục. Ví dụ, điều này sẽ làm việc trên Windows:

open my $fh, '<', 'C:/some/directory/to/some/file'; 

nhưng điều này có thể không, bởi vì nó cần phải được xử lý bởi cấu trúc hệ thống:

system("C:/some/program.exe C:/some/program/argument.txt"); 
+0

Cảm ơn bạn đã liên kết tới Perlport. Tôi đã học được điều gì đó về 'unlink' và VMS khá thú vị. Chương trình của tôi là trả về tên tập tin/thư mục cho một chương trình gọi điện thoại, vì vậy tôi không quá lo lắng về tên bên ngoài, nhưng tôi có thể thêm tùy chọn. –

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