2016-08-25 9 views
0

以下のように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)。しかし、上記のコードは、パターンにもマッチしないファイルを返しています。

+0

パターン '* BVN ...'あなたのコードでは? – Mike

+0

@Mike ERR_FILETYPEはプロパティファイルで設定される変数です。$ ERR_FILETYPE = "BVN * .fin.bc_lerr.xml.bc"; – user2570205

+1

あなたの '$ ERR_STAGING'変数に、正規表現のメタキャラクタ' \ | (){{^ $ * +?あなたは予想外の動作をするかもしれません。詳細については、[quotemeta](http://perldoc.perl.org/functions/quotemeta.html)を参照して、リテラル文字列と一致させる正規表現を常に引用することをお勧めします。 –

答えて

1

正しい二列:

$ERR_FILETYPE =~ s/\*/.\*/g;      # Add DOT 

@file_type = grep /\/$ERR_FILETYPE$/, @allfiles; # such a filter is sufficient 
+0

この作品は完璧です! – user2570205

1

私は、代替を提案するつもりです - あなたはパターンとして'BVN*.fin.bc_lerr.xml.bc'に言及。

しかし、それは正規表現ではありません。(まあ、大丈夫です。でも、BVNの後に何もしたくないと確信しています。そしてあなたはそれを正規表現に変換しようとしているようです。

これは、正規表現ではなく、実際にシェルグロブを探していることを意味します。彼らは似ていますが、同じではありません。

readdirgrepの代わりに、あなたが望むものがglobであることをお勧めします。

その後、次のことができます。

my @files = glob ('/path/to/BVN*.fin.bc_lerr.xml.bc'); 

...と、それはそれです。 シェルロジックではなく、regexロジックではなく、/path/toのパターンを展開し、それに一致するファイルを検索します。あなたの例ではそう

my @files = glob ("$ERR_STAGING/$ERR_FILETYPE"); 
+0

これはあまりにも意味があります。 – user2570205

関連する問題