【问题标题】:How do I filter filenames with regex instead of glob expressions?如何使用正则表达式而不是 glob 表达式过滤文件名?
【发布时间】:2011-11-10 18:22:12
【问题描述】:

我正在过滤一个目录的文件:

chdir '/home/brian/mypics/';
@picArray   = <*.JPG *.GIF *.jpg *.gif *.PNG *.png *.jpeg>;
@soundArray = <*.mid *.MID *.wav *.WAV *.mp3 *.MP3 *.wma *.WMA *.ogg *.OGG>;

我知道必须有一种更好、更简单的方法,它不区分大小写,并且可以允许像 gif|png|jpe?gwma|ogg|mp3|wave?|midi? 这样的正则表达式。

我怎样才能有一个数组来捕获所有未知的文件类型(例如,如果一个是 .exe,它将在一个数组中,因为其他两个从未捕获它,所以它完全属于它自己的数组)?

【问题讨论】:

  • 要回答问题的第二部分,请使用part 对列表进行分区。下次最好打开一个单独的问题。

标签: arrays perl filtering


【解决方案1】:

opendir/readdir 可以工作:

opendir(my $dh, "/tmp/");
my @files = readdir($dh);
my @picArray = grep { /\.(gif|png|jpe?g)$/i } @files;
my @soundArray = grep { /\.(wma|ogg|mp3|wave?|midi?)$/i } @files;

【讨论】:

  • 您可能需要调整这些正则表达式,使它们只匹配文件名的末尾(并且可能还要查找前面的点)。否则,你会匹配到gifford.txt
  • 我刚刚在正则表达式中添加了 i 限定符,因为 OP 要求进行不区分大小写的匹配。
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2017-04-24
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多