2010-10-18 25 views
13

Tôi có thể làm điều gì đó như thế này trong Perl không? Có nghĩa là khớp mẫu trên tên tệp và kiểm tra xem nó có tồn tại hay không.Làm cách nào để kiểm tra xem tên tệp có khớp với mẫu có trong Perl không?

if(-e "*.file") 
    { 
     #Do something 
    } 

Tôi biết giải pháp còn đòi hỏi hệ thống liệt kê các tệp hiện tại; đọc nó như là một tập tin và sau đó suy ra cho dù tập tin tồn tại hay không.

Trả lời

29

Bạn có thể sử dụng glob để trả lại một mảng của tất cả các file phù hợp với các mô hình:

@files = glob("*.file"); 

foreach (@files) { 
    # do something 
} 

Nếu bạn chỉ muốn biết liệu một tập tin phù hợp với mô hình tồn tại, bạn có thể bỏ qua sự phân công:

if (glob("*.file")) { 
    # At least one file matches "*.file" 
} 
+6

Để hoàn thành, bạn có thể thực hiện 'foreach (glob (" *. Tệp ")) {something}' ... – dawg

+0

Nhưng tôi không thể đặt regexp vào đó. Tôi có thể sử dụng cụm từ thông dụng không? – Jean

+0

@alertjean Không, bạn sẽ phải mở thư mục và quét thủ công tên tệp bằng cách sử dụng cụm từ thông dụng. 'glob' chỉ hỗ trợ các thẻ [shell wild] truyền thống (http://www.tuxfiles.org/linuxhelp/wildcards.html). – meagar

0

Trên hệ thống * nix, tôi đã sử dụng những điều sau đây với kết quả tốt.

sub filesExist { return scalar (my @x = `ls -1a 2> /dev/null "$_[0]"`) } 

Trả lời bằng số kết quả được tìm thấy hoặc 0 nếu không có. Làm cho nó dễ dàng được sử dụng trong các điều kiện 'nếu' có điều kiện như:

if(!filesExist("/foo/var/not*there.log") && 
    !filesExist("/foo/var/*/*.log") && 
    !filesExist("/foo/?ar/notthereeither.log")) 
{ 
    print "No matches!\n"; 
} else { 
    print "Matches found!\n"; 
} 

Chính xác những gì bạn có thể sử dụng sẽ được xác định bởi những gì hệ vỏ của bạn hỗ trợ. Nhưng hầu hết các shell hỗ trợ sử dụng '*' và '?' - và chúng có cùng ý nghĩa ở mọi nơi tôi từng thấy. Tất nhiên, nếu bạn loại bỏ các cuộc gọi đến chức năng 'vô hướng', nó sẽ trả về các trận đấu - hữu ích cho việc tìm kiếm những tên tập tin biến.

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