2014-02-19 17 views
2

我正在編寫一個將遍歷目錄(包括subdir)的腳本,並將所需的文件推入數組中,以便我可以對每個文件。我可以收集數組中的find(&wanted,@directories)的輸出嗎

這裏是我的代碼:

use strict; 
use warnings; 
use File::Find; 

my $path = $ARGV[0]; 
find({ wanted => \&GetappropriateFile }, $path); 

sub GetappropriateFile 
{ 
    my $file = $_; 
    my @all_file; 
# print "$file\n"; 
    if (-f and /traces[_d+]/) 
    { 
    #print "$file\n"; 
    open(my $fh, "<", $file) or die "cannot open file:$!\n"; 
     while(my $line = <$fh>){ 
     $line =~ /Cmd\sline:\s+com.android*/; 
     push(@all_file,$file); 
     #print "$file\n"; 
    } 
close($fh); 
#print"@all_file\n"; 
    } 

} 

問題區域:我的$文件= $ _;

而不是使用「$文件」,如果我可以在這裏使用數組的方式,那麼我可以輕鬆地逐一閱讀這些文件並過濾它。

這裏我要做的是:我必須打開每個文件,並檢查字符串「命令行:com.android」,只要我得到這個字符串在文件中我必須推入當前文件一個數組並開始讀取另一個文件。

回答

4

這將是更好地避免全球變量。

use strict; 
use warnings; 
use File::Find qw(find); 

sub IsAppropriateFile { 
    my ($file) = @_; 
    if (-f $file && $file =~ /traces[_d+]/) { 
    open(my $fh, "<", $file) or die "cannot open file:$!\n"; 
    while (my $line = <$fh>) { 
     if ($line =~ /Cmd\sline:\s+com.android*/) { 
     return 1; 
     } 
    } 
    } 

    return 0; 
} 

{ 
    my $path = $ARGV[0]; 
    my @matching_files; 
    find({ 
    wanted => sub { 
     push @matching_files, $_ if IsAppropriateFile($_); 
    }, 
    }, $path); 

    print("$_\n") for @matching_files; # Or whatever. 
} 
+0

是否真的需要使用花括號,我的意思是第20行和第31行。 – Maverick

+1

@Maverick「花括號」 - 是的,因爲它們限制了'$ path'和'@ matching_files'變量的可見性,所以它們有意義。它們不是必需的,但這是一個很好的習慣(Perl具有塊範圍,因此它們的可見性在結束大括號處結束)。 – amon

+0

@Maverick,答案的重點是展示如何收集名稱的變量不必是全局的,所以曲線與答案相關,因爲它們強調了這一點。 (我個人總是在我的程序中使用它們,原因有很多。) – ikegami

3

@all_file之外的功能的認沽聲明,之後find()完成使用它,

my @all_file; 
sub GetappropriateFile 
{ 
    .. 
} 

你也可以用匹配成功後,文件讀取停止,

if ($line =~ /Cmd\sline:\s+com.android*/) { 
    push(@all_file, $file); 
    last; 
} 
+0

這裏我的問題是我可以迭代一個我的每個文件如果是的話那麼如何? – Maverick

+0

@Maverick你可以在'find()'遍歷完成後使用'@ all_file'。 –

相關問題