2014-01-29 10 views
0

我寫了一個腳本來匹配模式,並返回一個聲明爲一個文件如何匹配perl目錄下的多個文件的正則表達式模式?

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

my $file = '/home/Sidtest/sid.txt'; 
open my $info , $file or die " Couldn't open the $file:$!"; 
while(my $line = <$info>) { 
    if ($line =~ m/^#LoadModule ssl_module/) { 
     print "FileName =",$file," Status = Failed \n"; 
    } 
    elsif ($line =~ m/^LoadModule ssl_module/) { 
     print "FileName =",$file," Status = Passed \n"; 
    } 
} 
close $info; 

所以,現在我想修改此腳本在同一目錄下的多個文件工作。我沒能成功地做到這一點。任何人都可以請幫助我如何使它可以用於目錄中的任意數量的文件。

回答

1

這將讀取./directory和foreach文件中的每個文件,打印出每一行。

print語句可以改變,以print if /match/,或任何你想要的:

my @dir = <directory/*>; 

foreach my $file (@dir){ 
    open my $input, '<', $file; 
     while (<$input>){ 
     print "PASS: $_\n" if m/^#LoadModule ssl_module/; 
     [...] 
    } 
} 
+0

作品。謝謝您的幫助。 – Illusionist

0

變量@ARGV包含發送到該腳本的參數列表啓動時。通過@ARGV循環和調用腳本與您要處理的文件:

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

foreach my $file (@ARGV) { 
    open my $info , $file or die " Couldn't open the $file:$!"; 
    while(my $line = <$info>) { 
     if ($line =~ m/^#LoadModule ssl_module/) { 
      print "FileName =",$file," Status = Failed \n"; 
     } 
     elsif ($line =~ m/^LoadModule ssl_module/) { 
      print "FileName =",$file," Status = Passed \n"; 
     } 
    } 
    close $info; 
} 

# process all files *.txt in your dir: ./myscript.pl /home/Sidtest/*.txt 
0

檢查的perldoc perlrun,並期待在-p和-n參數。從本質上講,他們把你的腳本看作是循環內容的標準輸入,其中stdin是通過遍歷命令行提供的文件生成的。可以使用$ ARGV變量訪問當前正在處理的文件的名稱。

所以,你可能去的方法,即你的整個腳本看起來更像這樣,使用-n PARAM,其中$ _包含當前行:

if (m/^#LoadModule ssl_module/) { 
    print "FileName =",$ARGV" Status = Failed \n"; 
} elsif (m/^LoadModule ssl_module/) { 
    print "FileName =",$ARGV," Status = Passed \n"; 
} 
+0

你真的**試過嗎? – Toto