Невозможно объединить два выражения регулярного выражения для одновременной работы - PullRequest
0 голосов
/ 06 января 2020

У меня есть простой perl код, который отображает имена файлов в данном каталоге

opendir my $dir, "./images/sampleImages" or die "Cannot open directory: $!";
my @Images = grep {!/^\./} readdir $dir;
closedir $dir;

Я добавил оператор регулярного выражения для удаления всех одинарных и двойных точек, поскольку readdir добавляет их как специальные символы, и это работает отлично. Однако я хочу, чтобы были прочитаны только файлы с расширениями .jpg / .jpeg / .png / .gif. Я нашел регулярное выражение, которое делает это, а именно:

(/\.(gif|jpg|jpeg|png)$/i)

Но я не могу заставить их работать вместе. Я перепробовал все, что мог найти по этому вопросу, комбинируя утверждения по-разному, но либо они дают ошибки, либо вычеркивают не так, как следует. Любая помощь будет принята с благодарностью, заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 06 января 2020

Это работает?

my @Images = grep { !/^\./ && /\.(gif|jpg|jpeg|png)$/i } readdir $dir;
3 голосов
/ 06 января 2020

Вы можете использовать несколько операторов сопоставления:

 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;

Опять же, хотя я это знаю и написал миллион раз Я все еще добавляю его, только когда вижу . и .. в выводе. Некоторые вещи никогда не меняются.

0 голосов
/ 07 января 2020

Следуя кодовым фильтрам только на изображениях, не нужно смотреть на . и .. на все

use strict;
use warnings;

use feature 'say';

my $dirname = './images/sampleImages';

opendir my $dir, $dirname 
    or die "Cannot open directory: $dirname";

my @Images = grep { /\.(gif|jpg|jpeg|png)$/i } readdir $dir;

closedir $dir;

map{ say } @Images;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...