2015-05-20 3 views
0

Мое требование состоит в том, чтобы узнать, являются ли в каталоге не менее 2 .wav файлов.Как проверить наличие более одного файла с заданным расширением файла в perl

В настоящее время я использую grep(/\.wav$/,readdir($dir)), чтобы получить номер файла .wav, а затем проверьте его greater than 1.

Но я действительно не хочу считать все файлы, если они были 1000s.

Кто-нибудь есть лучшее решение для этого ...

Спасибо :)

ответ

4

В скалярном контексте можно перебрать элементы каталога с помощью while(), и немедленно разорвать петлю, когда ваше условие выполнено,

my $count = 0; 
while (defined(my $f = readdir $dir)) { 
    if ($f =~ /\.wav$/ and ++$count >= 2) { 
     print "there are at least two wav files\n"; 
     last; 
    } 
} 
+1

Спасибо Сухой27. Лучшее решение :) –

0

Вы можете использовать glob расширить список файлов в директории с widcards, или лучше bsd_glob из пакета File::Glob:

use File::Glob ':bsd_glob'; 
my @wavfiles = bsd_glob("$your_directory/*.wav"); 
my $count_wavs = @wavfiles; 

Обратите внимание, что количество файлов использует массив в скалярном контексте.

bsd_glob лучше, потому что он правильно обрабатывает пробелы в именах каталогов (среди прочих), предпочитает этот на glob.

+0

, но все равно он считает все файлы. Зачем подсчитывать все файлы, чтобы увидеть, есть ли как минимум 2 файла. –

+0

Глобулизация может быть медленной, если есть много файлов с запрошенным расширением, иначе это довольно быстро. По сравнению с принятым решением, если ваш каталог содержит zz.wav и zzz.wav и многие другие файлы, функция может быть довольно длинной. Помимо этого, я думаю, что это достаточно просто, чтобы его можно было использовать. – Bentoy13