不能同时组合两个正则表达式语句



>我有一个简单的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)

但我似乎不能让他们一起工作。我已经尝试了我能在这里找到的关于这个主题的所有内容,以不同的方式组合语句,但它们要么给出错误,要么完全没有按照应有的方式工作。任何帮助将不胜感激,提前感谢!

这行得通吗?

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

您可以使用多个匹配运算符:

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;

同样,即使我知道并写了一百万次,我仍然只在输出中看到...时才添加它。有些事情永远不会改变。

仅在图像中遵循代码过滤器,根本不需要查看...

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;

最新更新