2010-10-18 11 views

Odpowiedz

29

Można użyć glob powrót tablicę wszystkich plików pasujących do wzorca:

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

foreach (@files) { 
    # do something 
} 

Jeśli po prostu chcesz wiedzieć, czy plik pasujący do wzorca istnieje, można pominąć Zadanie:

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

Aby być kompletnym, możesz zrobić 'foreach (glob (" *. File ")) {coś}' również ... – dawg

+0

Ale nie mogę tam wstawić wyrażeń regularnych. Czy mogę używać wyrażeń regularnych? – Jean

+0

@alertjean Nie, będziesz musiał otworzyć katalog i ręcznie skanować nazwy plików za pomocą wyrażeń regularnych. 'glob' obsługuje tylko tradycyjne [powłoki dzikie karty] (http://www.tuxfiles.org/linuxhelp/wildcards.html). – meagar

0

W systemach * nix użyłem następujących elementów z dobrymi wynikami.

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

Odpowiada liczbie znalezionych pasujących lub 0, jeśli brak. Dzięki temu można go łatwo zastosować w warunkach "if" takich jak:

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"; 
} 

Dokładnie jakie wzorce można zastosować, będzie zależało od tego, co obsługuje twoja powłoka. Ale większość powłok obsługuje użycie "*" i "?" - i mają na myśli to samo, wszędzie, gdzie widziałem. Oczywiście, jeśli usuniesz wywołanie funkcji "skalarnej", zwróci ona dopasowania - przydatne do znalezienia tych nazw plików zmiennych.