假设有一个数组,我想在当前目录中找到相应的文件。我有一个模式匹配的问题,那些文件中有一个标志,但其余的一切都没问题!
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 .... }
}
}
答案 0 :(得分:4)
这是因为正则表达式具有特殊含义的特殊字符。
您可以使用\Q
和\E
正则表达式修饰符来解决此问题。
if ($file =~ m/\Q$a[$i]\E/ ) {
另外 - 启用use strict;
和use warnings;
。我假设原始代码中的破坏的正则表达式(没有尾随/
)是一个错字。
我还建议您使用readdir
和grep
来代替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/) {
}