2012-04-11 25 views
0

ディレクトリに格納されているファイル名の先頭部分と一致する文字列がPerl変数に格納されています。Perlのgrepを使用して特定のファイルを検索する方法

この変数を使用して、このパターンに一致するファイルをPerlのgrepを使ってディレクトリから探します。ここで私はやっているものです:

opendir (DIR, "data/testroot/") or die "$!"; 
    @file1 = <$f1/*.hdf> 
    foreach(@file1){ 
     $patt = substr(basename($_),0,$ind); 
     $file2 = grep {/${patt}*\.hdf/} readdir(DIR); 
     #other code follows....... 
    } 
    closedir(DIR); 

まず、私は、フォルダf1内のすべてのファイルのリストを取得し、配列@fileに格納します。次に、@file1の各エントリについて、最初の数文字を抽出して$pattに格納し、$pattに格納されている一致する開始パターンを持つ別のフォルダdata/testroot/から同様のファイルを取得しようとします。

そのgrep $file2 = grep {/${patt}*\.hdf/} readdir(DIR);は機能していません。

答えて

0

${patt}*\.hdfは、「$ pattの0回以上の出現、その後の.hdf」を意味します。あなたは "$ patt、その後に任意のテキスト、続いて.hdf"を意味するのではないでしょうか?

これは/${patt}.*\.hdf/になります。

+0

はい私は '$ {patt}'に続いて1つ以上の文字と '.hdf'をマッチさせたいので、私はその部分を得ました。しかし、私の行を次のように変更すると、 '$ file2 = grep {/${patt}.*\.hdf}/} readdir(DIR);'それでもファイルを取得しません。何かが間違っている。 – srsci

+0

申し訳ありませんが私の間違い。それは問題を引き起こしていたので、そこに余分な '}'がありました。どうもありがとう。私は新しいことを学びました。 – srsci

1

*.hdfすべてのファイルがディレクトリAにあり、そのファイル名がディレクトリBの最初の$ind文字と一致するようにしたいと思いますか?

両方のディレクトリにglobまたはreaddirのいずれかを使用する必要がありますが、両方を使用することはできません。この場合、globはAからのすべての*.hdfファイルを正規表現でチェックする必要なしに選択できるので最善の策です。

下記のプログラムは、必要な処理を行っているようです。私は$f1$indのサンプル値を置き換えました。

use strict; 
use warnings; 

use File::Basename; 

my $f1 = 'data'; 
my $f1 = 'data/testroot'; 
my $ind = 6; 

foreach (glob "$f1/*.hdf") { 
    my $patt = substr(basename($_), 0, $ind); 
    my @match = glob "$f2/$patt*.hdf"; 

    #other code follows....... 
} 
+0

grepがまったく必要かどうか疑問に思います。 '$ patt'が別のファイル名の特別なものでない場合、$ patt * .hdf" 'それを' glob 'しないでしょうか? –

+0

ええ、 'glob'はループで実行すると代替ファイルが見つからないので、grepに戻ってください。 – srsci

+0

また、これを行うと' $ patt = substr(basename($ _)、0、$ ind);私の@ file2 = grep {basename($ _)=〜/^\ Q $ patt /} glob <$f2/*.hdf>; 'うまくいかないようです。 '$ _'は最初のフォルダ' A'から読み込まれた最初のファイル名を保持します。では、 'glob'の出力を' grep'にどのようにパイプしますか?もう一つは、PERLは 'basename'に' $ _'を使うように強制します。そうしないと、エラーがスローされます。申し訳ありませんが、私はPERLでうなずいているので、私の質問のいくつかは馬鹿に聞こえるかもしれません。 – srsci

関連する問題