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