以下のように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します。 grepファイルは'BVN*.fin.bc_lerr.xml.bc'
のように一致します(例:BVN_201608250000.fin.bc_lerr.xml.bc
)。しかし、上記のコードは、パターンにもマッチしないファイルを返しています。
パターン '* BVN ...'あなたのコードでは? – Mike
@Mike ERR_FILETYPEはプロパティファイルで設定される変数です。$ ERR_FILETYPE = "BVN * .fin.bc_lerr.xml.bc"; – user2570205
あなたの '$ ERR_STAGING'変数に、正規表現のメタキャラクタ' \ | (){{^ $ * +?あなたは予想外の動作をするかもしれません。詳細については、[quotemeta](http://perldoc.perl.org/functions/quotemeta.html)を参照して、リテラル文字列と一致させる正規表現を常に引用することをお勧めします。 –