8

我的要求是使用perl打印文件名中包含“xyz”文本的文件。我在下面尝试并收到以下错误

量词不遵循正则表达式中的任何内容,由 <-- HERE in m/* <-- HERE xyz.xlsx$/;

use strict;
use warnings;

my @files = qw(file_xyz.xlsx,file.xlsx);
my @my_files = grep { /*xyz.xlsx$/ } @files;
for my $file (@my_files) {
    print "The output $file \n";
}

当我添加*grep 正则表达式时,问题来了。我怎么可能做到这一点?

4

1 回答 1

10

*一个元字符,称为量词。它的意思是“重复前一个字符或字符类零次或多次”。在您的情况下,它什么都不遵循,因此是语法错误。您可能正在尝试匹配任何内容,即.*:通配符,后跟量词。但是,这已经是正则表达式匹配的默认行为,除非它被锚定。所以你只需要:

my @my_files = grep { /xyz/ } @files;

您可以保留字符串 anchor 的结尾xlsx$,但由于文件名列表有限,这似乎没有必要。虽然你用qw()错了,但不是逗号分隔,而是空格分隔:

my @files = qw(file_xyz.xlsx file.xlsx);

但是,如果您应该有一组更大的文件名,例如从目录中读取的文件名,您可以在中间放置一个通配符字符串:

my @my_files = grep { /xyz.*\.xlsx$/i } @files;

请注意使用/i修饰符不区分大小写匹配。另请注意,您必须转义.,因为它是另一个元字符。

于 2013-07-22T13:05:34.713 回答