2017-01-30 8 views
1

は、誰もが下記の問題にはPerlスクリプトで私を助けることができます:たPerl:フォルダ内のファイルの一覧からキーワードの無限リストを検索する方法

FILE1.TXTが - >キーワードで検索する

Hello_ 
World! 
+Bye 
Temp- 

File2(任意の拡張子の可能性があります)検索対象のキーワード、File3、File4 ....

File2のFile1からすべてのキーワードを検索したい場合はキーワードを印刷しますこの特定のキーワードが見つかったファイル番号と行番号とともに検索されます。

これらのキーワードやファイルを不定期にする必要はありません。追加したり変更したりできます。

open(MYINPUTFILE, "<expressions.txt"); 
# open for input 

my(@lines) = <MYINPUTFILE>; 
#print @lines; 

my @files = grep (-f ,<*main_log>,<*Project>); 

$n = 0; 
$l = 0; 
#foreach my$file (@files) { 
foreach my $line (@lines) { 
    my @f = grep /$line/,@files; 
    print "@f\n"; 
} 
#} 
} 

問題 - 私は上記のコードを実行しようとしましたが、コマンドプロンプトに何も印刷されません。下のコメント欄での質問について

use strict; # always use these 
use warnings; 

open(my $kw, '<', 'expressions.txt') or die $!; 
my @keywords = <$kw>; 
chomp(@keywords); # remove newlines at the end of keywords 

# get list of files in current directory 
my @files = grep { -f } (<*main_log>,<*Project>); 

# loop over each file to search keywords in 
foreach my $file (@files) { 
    open(my $fh, '<', $file) or die $!; 
    my @content = <$fh>; 
    close($fh); 
    my $l = 0; 
    foreach my $kw (@keywords) { 
    my $search = quotemeta($kw); # otherwise keyword is used as regex, not literally 
    foreach (@content) { # go through every line for this keyword 
     $l++; 
     printf 'Found keyword %s in file %s, line %d:%s'.$/, $kw, $file, $l, $_ 
     if /$search/; 
    } 
    } 
} 

::私は、Windows 7

+2

ようこそ。何を試しましたか? – Zaid

+0

私は以下のコードを試しましたが、それは私に欲しい出力を与えません。 – rocky

+0

#open(MYINPUTFILE、 "; #print @lines; #my @files = grep(-f、<*main_log>,); #$ n = 0; #$ l = 0; ##foreach my $ file(@files){ #foreach my $ line(@lines) #{ #my @f = grep/$ line /、@ files; #print "@ f \ n"; #}今後の参考のために の##} #} – rocky

答えて

0

を使用しています。この答えは、あなたの投稿コードに基づいて

最も内側のループは、単に行番号 $l++のためにカウントし出し

発生した場合に見つけます - if /$search/は依然として上記のステートメントの一部です。

if (/$search/) { 
    printf ... 
} 

printfは、出力をフォーマットするために使用されます。 printを使って簡単にこれを行い、必要なすべての変数を連結することもできます。私はちょうどこの方法を好む。

これは、すべてのファイルに対してキーワードごとに見つかった行のリストが必要であることを前提としています。 @keywords@contentの順序とロジックを切り替えて、行順にする必要があります。

キーワードファイルのコメントに関する追加機能については、コメントから検索用語を識別するためにコンテンツを後処理する必要があります。おそらく、検索タームをキーとしたハッシュと値としてのコメント。次に、検索のためにハッシュキーのみを使うことができます(最も内側のループを見てください)。

+0

この例では、意図的に 'keyword first'を使用しました。 OPが最初に注文したライン番号を希望する場合、彼は容易に変更を採用することができます。原則は明確でなければならない。 – SREagle

+0

下記のようなexpressions.txtの下に置かれた場合、複数のキーワードを検索することはできません。 Hello world bye ...新しい行のすべてを別々のキーワードとして扱う – rocky

+0

申し訳ありませんが、キーワード配列には改行が最後に含まれています。 'chomp'によって修正されました... – SREagle

関連する問題