2010-10-18 13 views

risposta

29

È possibile utilizzare glob per restituire una matrice di tutti i file che corrispondono al modello:

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

foreach (@files) { 
    # do something 
} 

Se si vuole semplicemente sapere se esiste un file corrispondente al modello, è possibile saltare l'assegnazione:

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

Per essere completo, è possibile eseguire 'foreach (glob (" *. File ")) {something}' allo stesso modo ... – dawg

+0

Ma non riesco a inserire regexp lì. Posso usare le espressioni regolari? – Jean

+0

@alertjean No, dovrai aprire la directory e scansionare manualmente i nomi dei file usando un'espressione regolare. 'glob' supporta solo le tradizionali [shell wild card] (http://www.tuxfiles.org/linuxhelp/wildcards.html). – meagar

0

Su sistemi * nix, ho utilizzato quanto segue con buoni risultati.

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

Risponde al numero di risultati trovati o 0 se nessuno. Che lo rende facilmente utilizzato in 'se' condizionali come:

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

Esattamente quello che i modelli è possibile utilizzare sarebbero determinate da ciò che i vostri supporti di shell. Ma la maggior parte delle shell supporta l'uso di '*' e '?' - e significano la stessa cosa ovunque io abbia visto. Ovviamente, se si rimuovesse la chiamata alla funzione 'scalare', si restituirebbero le corrispondenze, utili per trovare quei nomi di file variabili.

Problemi correlati