2012-11-05 18 views
5

Đây là lý do tại sao tôi hỏi câu hỏi này: Tôi viết rất nhiều đoạn mã bash và Perl, và tôi thấy mình phải nối hai đường dẫn thường xuyên. Một cái gì đó như thế này là điển hình:Làm thế nào để Unix đọc một tên đường dẫn với hai dấu gạch chéo liên tiếp? (ví dụ:/home/user // mystuff)

my $prefix = "/home/user/"; 
my $suffix = "/mystuff"; 
... 
chdir $prefix.$suffix; 

Vấn đề là tôi không luôn luôn nhớ nếu tôi đặt một dấu gạch chéo ở phần cuối của các tiền tố, hoặc nếu tôi đặt một dấu gạch chéo ở phần đầu của hậu tố. Vì vậy, tôi có thể vô tình nối hai dấu gạch chéo với nhau, như trong ví dụ trên.

Vì vậy, câu hỏi chính của tôi là liệu hai dấu gạch chéo liên tiếp có gây ra bất kỳ sự cố nào và tại sao không. Nhưng ngoài ra, các lập trình viên có một quy ước cho điều này không? Trong mã mà người khác viết, tên thư mục luôn kết thúc bằng dấu gạch chéo? Sẽ tốt hơn nếu có một số quy tắc nhất quán mà tôi có thể làm theo.

+0

Đề nghị bạn xem xét sử dụng một mô-đun như 'File :: Spec' hoặc tương tự, xử lý tất cả các dấu tách cho bạn, cụ thể cho platfor m tập lệnh đang chạy, do đó cải thiện tính di động. – David

Trả lời

5

Nó hoàn toàn ổn. Các dấu gạch chéo lặp lại được xử lý như một hệ thống Unix, vì vậy hãy luôn thêm một.

my $prefix = "/home/user"; # Or "/home/user/" 
my $suffix = "mystuff"; 
my $dir = "$prefix/$suffix"; 

Nhưng nếu bạn muốn có một con đường phong thánh vì lý do gì (ví dụ như nó sẽ được hiển thị cho người dùng), bạn có thể sử dụng:

use Path::Class qw(dir); 
my $prefix = dir("/home/user"); # Or "/home/user/" 
my $dir = $prefix->subdir($suffix); 
say $dir; 

dù bạn bắt đầu với /home/user, /home/user/ hoặc thậm chí ///home///user/// , bạn kết thúc với:

/home/user/mystuff 
+0

Điều đó sẽ được viết hiệu quả hơn như là «dir ($ prefix, $ suffix)'. – cjm

+0

@cjm, Điều đó có nghĩa là mã của bạn sẽ có một hỗn hợp của Đường dẫn :: đối tượng Lớp và đường dẫn đơn giản. Mã của tôi sẽ không có. 'Dir (tiền tố $)' sẽ được thực hiện lâu trước khi '$ suffix' xuất hiện. – ikegami

+0

@cjm, tôi cũng nghi ngờ rằng tiết kiệm hiệu quả sẽ đáng nói đến. – ikegami

5

Vỏ và hạt Unix vui vẻ xử lý việc này, cũng như những thứ như "/firstpart/./secondpart", nhưng nói chung bạn không làm dấu gạch chéo một phần giá trị biến để làm cho biểu thức đường nối trông đẹp hơn: $ {firstpart}/$ {secondpart} thay vì $ {firstpart} $ {secondpart}.

Trong tập lệnh trên Linux, công cụ dòng lệnh readlink có thể được sử dụng để chuẩn hóa tên tệp.

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