2010-10-18 19 views

cevap

29

Sen desen eşleştirme tüm dosyaların bir dizi dönmek glob kullanabilirsiniz: sadece desen eşleştirme bir dosya var olup olmadığını bilmek isterseniz atama atlayabilirsiniz,

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

foreach (@files) { 
    # do something 
} 

:

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

Tam olmanız için, foreach (glob ("*. File")) {şey} 'yi de yapabilirsiniz ... – dawg

+0

Ama ben orada regexp koyamıyorum. Normal ifadeler kullanabilir miyim? – Jean

+0

@alertjean Hayır, dizini açmak ve düzenli bir ifade kullanarak dosya adlarını manuel olarak taramanız gerekir. glob sadece geleneksel [kabuklu vahşi kartları] destekler (http://www.tuxfiles.org/linuxhelp/wildcards.html). – meagar

0

On * nix sistemlerinde, aşağıdakileri iyi sonuçlarla kullandım.

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

Bulunan eşleşme sayısı veya hiç değilse 0 ile cevap verir. kolayca kullanılan yapma 'eğer' gibi şart: Eğer kullanabilirsiniz desenler göründüğünü anlamak için kabuk desteklerle tarafından belirlenecektir Tam olarak ne

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

. Ancak çoğu kabuk, '*' ve '?' Kullanımını destekler. - ve gördüğüm her yerde aynı şeyi kastediyorlar. Tabii ki, 'skaler' işlevine çağrıyı kaldırırsanız, eşleşmeleri döndürür - bu değişken dosya adlarını bulmak için kullanışlıdır.

İlgili konular