2016-04-20 11 views
0

ソースファイルをフィルタリングするためのコールバック機能をファイルに使用しようとしています。それは今のところうまく行かず、太陽の下のすべてをつかむだけです。ファイルを使用してソースファイルを取得するには

あなたは良い方向に私を指摘できますか?

#!/usr/local/bin/perl 
use strict; 
use warnings; 

use File::Find; 

my @srcFiles; 
my @srcExt = qw(cpp h py pl); 


my @startDir = qw(.); 
find(sub{ 
     my @fields = split /'.'/, $File::Find::name; 
     push @srcFiles, $File::Find::name if grep $fields[-1], @srcExt; 
    }, 
    @startDir); 
print 'Source files found: ', @srcFiles; 

あなたの問題はあなたがとてもドットを使用してファイルを分割したいあなたのスプリットで

my @ar = split /'.'/, $File::Find::name; 
       ^
      here is your problem. 

あるおかげ

答えて

4

、あなたは'.'を試してみました。しかし、それは逃げていません。キャラクター使用バックスラッシュをエスケープします。だから、構文は

my @ar = split /\./, $File::Find::name; 

だからあなたのコードがある

find(sub{ 
    my @fields = split /\./, $File::Find::name; 
    push @srcFiles, $File::Find::name if grep $fields[-1], @srcExt; 
}, 
@startDir); 

こともないと従うようなものを試してみてください、これはあなたのコードよりも効果的であると@hobbsコメントで述べたように、それはいくつかのバグを修正します。

パイプを分けて配列を結合します。次に、プリコンパイルされた正規表現(qr)を使用して、非キャプチャグループを追加します。次に、変数を解析してサブルーチンをチェックします。

#!/usr/local/bin/perl 
use strict; 
use warnings; 

use File::Find; 

my @srcFiles; 
my @srcExt = qw(cpp h py pl); 
my $match = join("|",@srcExt); 
$match = qr/\.(?:$match)$/; 

my @startDir = qw(.); 

find(sub 
{ 
    my $s = $File::Find::name; 
    push(@srcFiles,$s) if($s =~m/$match/); 

} 
, @startDir); 

print @srcFiles; 
+0

それは動作しますが、感謝を。私のバージョンのエラーは何ですか?基本的に私がやろうとしたのは、ファイル名を '。'に分割し、最後のフィールド(拡張子)を取得し、その拡張子にマッチさせることです。 私はあなたのアプローチを理解していますが、私も訂正したいと思います。 – zebullon

+0

@zebullon投稿の編集: – mkHun

+0

@zebullon 'grep'も間違っています - ' $ fields [-1] 'が真の値で' @ srcExt'が空でない限り 'if'条件は真です。 – hobbs

1
my @fields = split /'.'/, $File::Find::name; 

この正規表現は、それがアポストロフィが続く任意の文字が続くアポストロフィを、見つけたファイル名を分割します。これは間違いなくあなたが意図したものではありません。

代わりに、試してみてください。

my @fields = split /\./, $File::Find::name; 
関連する問題