2016-09-15 9 views
2

パターンが "my_Report"で始まる10個以上のファイルがあるディレクトリがあります。 私はこの仕事にglodを使ってみたが、ただ一つのファイルしか選んだことはなかった。またglobがパターンに一致するすべてのファイルを選択していない場合、構文に問題があります

$g_map{"Rep"} = glob ("data_1/reports/my_Report*"); 

以下の構文に問題がある、私は私の要件は、特定のパターンを持つすべてのファイルを見つけることです

$g_map{"Rep"} = [grep {!/\.xh$/} <data_1/reports/my_Report*>]; 
をすべてのファイルを見つけるためにはgrepを使用してみましたし、ハッシュに格納しディレクトリから "Rep"というキーを使ってハッシュに格納する globで同じようにするにはどうすればいいですか?

ありがとうございました

+0

、 '/'パスの先頭にはあります。下の方にはありません。 – simbabque

+0

@simbabque:申し訳ありませんが、タイプミスですが、これは問題ではありません。この問題が発生します。iamがglobを使用する方法で問題になるはずです。 – LearningCpp

+0

私は 'ls'の出力を追加すると言っていますが、mob答えのすぐ下にあります。 – simbabque

答えて

3

最初の呼び出しはスカラーコンテキストです。スカラーコンテキストでは、globは(多くとも)単一の結果を返します。

は(あなたが2回目の呼び出しで行うように)

$g_map{"Rep"} = [ glob("data_1/reports/my_Report*") ] 

をリストコンテキストを使用して、一致するすべてのファイルを取得したり、1件の結果を期待している場合、または単に最初の結果

($g_map{"Rep"}) = glob("data_1/reports/my_Report*"); 
+0

あなたは自分の答えを入力しているに違いありません:)少なくともOPにはいくつかの異なるオプションがあります – stevieb

2

にしたいために、 globはリストを返しますが、あなたはスカラーコンテキストでそれを呼び出しているので、結果が1つしか得られません。

@{ $g_map{Rep} } = glob ("data_1/reports/my_Report*"); 

配列リファレンスに$g_map{Rep}ハッシュキーを回すだろう、とすべてのファイルがそれに格納されること:これを試してみてください。

あなたはこのようにアクセスすることができます上部のコマンドで

for (@{ $g_map{Rep} }){ 
    print "filename: $_\n"; 
} 
+0

これはスカラーコンテキストのリストの通常の場合ではありません。代わりに 'glob 'はスカラーコンテキストで* iterator *として動作し、while(my $ node = glob' pattern '){...}'のようなループを許します – Borodin

関連する問題