我的perl代码如下所示。尝试匹配模式的选择文件。
opendir ERR_STAGING_DIR, "$ERR_STAGING" or die "$PID: Cannot open directory $ERR_STAGING";
@allfiles = grep !/^$ERR_STAGING\/\./, map "$ERR_STAGING/$_", readdir(ERR_STAGING_DIR);
closedir(ERR_STAGING_DIR);
$ERR_FILETYPE = basename ($ERR_FILETYPE);
$ERR_FILETYPE =~ s/\./\\\./g;
$ERR_FILETYPE =~ s/\*/\*/g;
@file_type = grep /^$ERR_STAGING/./$ERR_FILETYPE$/, @allfiles;
$numelements = @file_type;
if ($numelements <= 0) {
print LOG "$PID: No files match specified pattern, exiting.\n";
&HandlerDie($NO_FILE_TYPE, $current_poid);
}
以上是我正在做的事情。从ERR_STAGING目录中获取所有文件。 grep文件匹配模式'BVN*.fin.bc_lerr.xml.bc'
,例如BVN_201608250000.fin.bc_lerr.xml.bc
,并对文件执行某些操作。但是上面的代码返回的文件也与模式不匹配,它也会拾取一些临时目录。
答案 0 :(得分:1)
纠正两行:
$ERR_FILETYPE =~ s/\*/.\*/g; # Add DOT
@file_type = grep /\/$ERR_FILETYPE$/, @allfiles; # such a filter is sufficient
答案 1 :(得分:1)
我打算提出另一种选择 - 你提到'BVN*.fin.bc_lerr.xml.bc'
作为模式。
但这不是一个正则表达式(好吧,好吧,它是 - 但我很确定你不希望在N
之后'你想要'零或更多BVN
'。而你似乎正试图将其转换为正则表达式。
这意味着你实际上在寻找一个shell glob,而不是一个正则表达式。它们相似,但不一样。
我可以建议代替readdir
和grep
而不是glob
。
然后你可以:
my @files = glob ( '/path/to/BVN*.fin.bc_lerr.xml.bc' );
......就是这样。它将使用 shell 逻辑扩展您的模式,而不是正则表达式逻辑 - 然后读取/path/to
以查找与之匹配的文件。
所以在你的例子中:
my @files = glob ( "$ERR_STAGING/$ERR_FILETYPE" );