我的要求是使用 perl 打印文件名中包含'xyz'文字的文件。 我在下面尝试并得到以下错误
Quantifier在正则表达式中没有任何内容,标记为< - 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正则表达式中添加*
时,问题就出现了。
我怎么可能实现这个目标呢?
答案 0 :(得分:8)
*
是一个元字符,称为量词。这意味着“重复前一个字符或字符类零次或多次”。在您的情况下,它什么都不遵循,因此是语法错误。您可能尝试的是匹配任何内容,即.*
:通配符,然后是量词。但是,这已经是正则表达式匹配的默认行为,除非它已锚定。所以你需要的只是:
my @my_files = grep { /xyz/ } @files;
你可以保留字符串锚xlsx$
的结尾,但由于你有一个有限的文件名列表,这似乎不太必要。虽然您使用了qw()
错误,但它不是以逗号分隔,而是以空格分隔:
my @files = qw(file_xyz.xlsx file.xlsx);
但是,如果您应该拥有更大的文件名集,例如从目录中读取的文件名,则可以在中间放置通配符字符串:
my @my_files = grep { /xyz.*\.xlsx$/i } @files;
请注意使用/i
修饰符来区分大小写不敏感。另请注意,您必须转义.
,因为它是另一个元字符。