Вы можете использовать несколько операторов сопоставления:
my @dirs =
grep { /\.(?:gif|jpe?g|png)\z/i && ! /\A\./ }
readdir $dir;
Обычно я делаю по одному grep
на идею, поэтому я могу отключить их по отдельности:
my @dirs =
grep { /\.(?:gif|jpe?g|png)\z/i }
grep { ! /\A\./ }
readdir $dir;
И часто добавляю в map
чтобы сделать полный путь, поскольку readdir
не делает этого для вас (и обычно я сначала делаю это неправильно, а затем возвращаюсь, чтобы сделать это):
my @dirs =
map { catfile( $dir, $_ ) }
grep { /\.(?:gif|jpe?g|png)\z/ }
grep { ! /\A\./ }
readdir $dir;
И, readdir
не делает «добавить» .
и ..
. Это виртуальные каталоги, которые означают текущий каталог и родительский каталог. Если это единственные вещи, которые вы хотите удалить, то вы можете улучшить эту часть, чтобы она соответствовала только тем, а не всем скрытым файлам:
my @dirs =
map { catfile( $dir, $_ ) }
grep { /\.(?:gif|jpe?g|png)\z/ }
grep { ! /\A\.\.?\z/ }
readdir $dir;
Опять же, хотя я это знаю и написал миллион раз Я все еще добавляю его, только когда вижу .
и ..
в выводе. Некоторые вещи никогда не меняются.