perl中的模式匹配,包括名称中带有标记的文件

时间:2015-03-11 15:42:11

标签: perl

假设有一个数组,我想在当前目录中找到相应的文件。我有一个模式匹配的问题,那些文件中有一个标志,但其余的一切都没问题!

files:
========
A+B-C_www.txt
A-B_CC.books.#1.txt

#!/usr/perl/bin

my @a = qw(A+B-C_www A-B_CC.books.#1);

my $dir = ".";
opendir(DIR, $dir);
my @files = grep(/txt$/,readdir(DIR));
closedir(DIR);

foreach my $file (@files){
    for (my $i=0, $i<=$#a, $i++)
      if ($file =~ m/$a[$i]){
        do some stuff ....}
      else{
        do some stuff .... }
    }
}

3 个答案:

答案 0 :(得分:4)

这是因为正则表达式具有特殊含义的特殊字符。

您可以使用\Q\E正则表达式修饰符来解决此问题。

if ($file =~ m/\Q$a[$i]\E/ ) {

另外 - 启用use strict;use warnings;。我假设原始代码中的破坏的正则表达式(没有尾随/)是一个错字。

我还建议您使用readdirgrep来代替while ( my $file = glob ( "*.txt" ) ) { 和{{1}}:

{{1}}

另外:您的模式匹配是子字符串匹配。如果这不是你想要的,你可能需要文本锚。

答案 1 :(得分:2)

与上述答案已经解决的模式匹配问题无关,您可以使用grep语句而不是内部for循环更加惯用地编写代码:

while ( my $file = glob('*.txt') ) {
   my $has_match = grep { $file =~ m|\Q$_\E| } @a; 

   if ( $has_match ) {
      # do something 
   } 
   else {
      # do something
   }
}

答案 2 :(得分:1)

使用quotemeta在插值前转义模式。

my $pattern = quotemeta($a[$i]);
if ($file =~ m/$pattern/) {
}