2010-10-18 11 views

Antwort

29

Sie können glob verwenden ein Array aller Dateien passend zum Muster zurück:

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

foreach (@files) { 
    # do something 
} 

Wenn Sie einfach nur wissen wollen, ob eine Datei mit dem Pattern-Matching vorhanden ist, können Sie die Zuordnung überspringen:

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

Nur um abzuschließen, können Sie 'foreach (glob (" *. File ")) {something}' auch tun ... – dawg

+0

Aber ich bin nicht in der Lage, regexp da drin zu setzen. Kann ich reguläre Ausdrücke verwenden? – Jean

+0

@alertjean Nein, Sie müssen das Verzeichnis öffnen und die Dateinamen manuell mit einem regulären Ausdruck scannen. 'glob' unterstützt nur die traditionellen [Shell-Wildcards] (http://www.tuxfiles.org/linuxhelp/wildcards.html). – meagar

0

Auf * nix-Systemen habe ich Folgendes mit guten Ergebnissen verwendet.

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

Es antwortet mit der Anzahl der gefundenen Übereinstimmungen, oder 0, wenn keine gefunden wurde. Es macht es leicht in 'Wenn'-Bedingungen wie:

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

Genau welche Muster Sie verwenden könnten würde bestimmt werden, was Ihre Shell unterstützt. Aber die meisten Shells unterstützen die Verwendung von '*' und '?' - und sie meinen dasselbe überall, wo ich gesehen habe. Wenn Sie den Aufruf der Funktion "Skalar" entfernen, werden natürlich die Übereinstimmungen zurückgegeben - nützlich, um diese variablen Dateinamen zu finden.