Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 模式匹配perl_Regex_Perl - Fatal编程技术网

Regex 模式匹配perl

Regex 模式匹配perl,regex,perl,Regex,Perl,我试图在文件夹中搜索与此条件匹配的任何文件。我知道我的正则表达式用法是错误的,但不知何故我不知道如何修复。提前谢谢 chdir $dir; opendir my $dh, $dir or die "can't open directory:$!"; while (my $entry = readdir $dh){ if($entry !~ m{\ *?_abc_*?[.]txt\z}x){ <do_something> } } chdir$di

我试图在文件夹中搜索与此条件匹配的任何文件。我知道我的正则表达式用法是错误的,但不知何故我不知道如何修复。提前谢谢

chdir $dir;
opendir my $dh, $dir or die "can't open directory:$!";
while (my $entry = readdir $dh){

  if($entry !~ m{\ *?_abc_*?[.]txt\z}x){

  <do_something>

  }
}
chdir$dir;
opendir my$dh、$dir或die“无法打开目录:$!”;
while(my$entry=readdir$dh){
if($entry!~m{\*?\u abc_*?[.]txt\z}x){
}
}

*
在regex中的含义与在shell globs中的含义不同。它们很相似,但不一样

*
表示前面匹配的出现次数为零或更多。因此,
\*
匹配零个或多个空格<代码>.*匹配零个或多个下划线。因此glob中的
*
在功能上等同于regex中的
*

虽然我可以告诉您如何修复正则表达式,但我认为更好的答案是首先使用
glob

foreach my $filepath ( glob ( "$dir/*_abc_*.txt" ) ) {
  # do something
} 
而不是一开始就尝试和regex匹配

opendir my $dh, $dir or die "can't open directory:$!";
while (my $entry = readdir $dh){
  if($entry !~ m{(.*?)\_abc\_(.*?)\.txt$}i){
    print $entry,"\n";
  }
}

试试上面的方法。当使用
/s
时,Nit:Regex
*
仅等同于glob
*
。代码注入错误
“$dir/*\u abc.*.txt”
应该是
“\Q$dir\E/*\u abc.*.txt”
。对于包含空格和其他字符的路径,您的版本将失败,这是我的计算机上(绝对)路径的很大一部分。您不应该将
$
替换为
\z
\z
是正确使用的atom。请注意,不需要转义
谢谢。我试过了,并将$更改为\z。效果很好。