2013-09-25 52 views
7

Tôi có một thư mục, tên của nó là:glob không nhận ra tên tập tin với dấu ngoặc vuông

drwxr-xr-x. 2 user user  4096 Aug 2 18:30 folder name [www.website.com] 

nhưng khi tôi sử dụng glob như thế này:

my @files = glob ("/home/user/Downloads/folder name [www.website.com]/*"); 
print "@files/n"; 

nó không liệt kê các tập tin trong thư mục, kết quả là như sau:

/home/user/Downloads/folder name 

Tôi đã cố gắng thoát khỏi khoảng trắng và dấu ngoặc vuông như sau:

/home/user/Downloads/folder\ name\ \[www.website.com\] 

Nhưng kết quả là như nhau, Điều gì có thể là lỗi của tôi hoặc Điều gì có thể làm để cải thiện mã của tôi?

Cảm ơn trước

+0

Không liên quan đến vấn đề của bạn, nhưng tôi nghĩ rằng bạn muốn '\ n' trong:' print "@files \ n"; ' – toolic

+1

Vâng, đó là sai lầm của tôi cảm ơn bạn – Davico

Trả lời

9

Các BUILTIN glob chức năng chia mô hình tại khoảng trắng. Vì vậy, bạn đang làm điều gì đó tương đương với

my @files = (
    glob("/home/user/Downloads/folder"), 
    glob("name"), 
    glob("[www.website.com]/*"), 
); 

Thoát khoảng trắng và dấu ngoặc vuông sẽ là một tùy chọn. Nhưng nó là tốt hơn để sử dụng lõi File::Glob module để kiểm soát tốt hơn:

use File::Glob ':bsd_glob'; 

my @files = bsd_glob("/home/user/Downloads/folder name \\[www.website.com\\]/*"); 

Bây giờ, chỉ có dấu ngoặc cần phải được thoát. Điều này cũng ghi đè lên nội dung dựng sẵn, do đó bạn không thực sự phải thay đổi mã của mình ngoại trừ một lần nhập (và tất nhiên là mẫu).

+0

Trên phiên bản Perl 5.14, tôi cần phải sử dụng File :: Glob ': glob'; '. Dường như ': bsd_glob' được thêm vào 5.16. – toolic

+1

@toolic Từ tài liệu: * Thẻ ': glob', bây giờ không được khuyến khích, là phiên bản cũ của': bsd_glob'. Nó xuất các hằng số và chức năng giống nhau, nhưng ghi đè 'glob()' của nó không hỗ trợ lặp lại, tức là có thể gây ra các vòng lặp vô hạn. Có vẻ như ': bsd_glob' đã được thêm vào trong perl 5.016. Nếu back-compat là cần thiết, sử dụng đúng đắn ': glob' có vẻ là điều đúng đắn cần làm. – amon

+0

Thoát không hoạt động. Thoát khỏi không gian sẽ dễ dàng hơn. – ikegami

1

Spaces và brackers vuông là đặc biệt trong mẫu glob. Để phù hợp với

/home/user/Downloads/folder name [www.website.com] 

bạn cần

/home/user/Downloads/folder\ name\ \[www.website.com\] 

Vì vậy, mô hình đầy đủ là

/home/user/Downloads/folder\ name\ \[www.website.com\]/* 

để xây dựng chuỗi đó, bạn có thể sử dụng các chuỗi chữ

"/home/user/Downloads/folder\\ name\\ \\[www.website.com\\]/*" 

kiểm tra:

$ perl -E'say for glob "/home/eric/Downloads/folder\\ name\\ \\[www.website.com\\]/*"' 
/home/eric/Downloads/folder name [www.website.com]/foo 

Lưu ý rằng không gian không thể thoát trong Windows. Bạn sẽ phải sử dụng File :: Glob's bsd_glob. (Đó là gọi hàm giống như glob, nhưng với lá cờ khác nhau.)

use File::Glob qw(bsd_glob); 
say for bsd_glob("C:\\Program Files\\*");