2016-07-19 4 views
-4

파일 배열이 있습니다. 이제 각 파일을 cat하고 파일 keywords.txt에있는 키워드 목록을 검색해야합니다.키워드 파일 목록 파일 검색

keywords.txt

AES 
3DES 
MD5 
DES 
SHA-1 
SHA-256 
SHA-512 
10.* 
http:// 
www. 
@john.com 
john.com 

이하 포함하고 나는 여기에 좋아

file jack.txt contains AES:5 (5 line number) http://:55 
file new.txt contains 3DES:75 http://:105 
+0

작동하지 않는 Perl 코드를 표시하지 않으면 도움을 줄 수 없습니다. – Borodin

답변

0

내 코드

use warnings; 
use strict; 

open STDOUT, '>>', "my_stdout_file.txt"; 


my $filename = $ARGV[2]; 
    chomp ($filename); 
    open my $fh, q[<], shift or die $!; 

    my %keyword = map { chomp; $_ => 1 } <$fh>; 
    print "$fh\n"; 
    while (<>) { 
    chomp; 
    my @words = split; 
    for (my $i = 0; $i <= $#words; $i++) { 
     if ($keyword{ $words[ $i ] }) { 
       print "Keyword Found for file:$filename\n"; 
       printf qq[$filename Line: %4d\tWord position:   %4d\tKeyword: %s\n], 
         $., $i, $words[ $i ]; 
     } 
} 
} 

입니다 아래와 같이 출력을 기대하고 있습니다 그러나 문제는 그 모든 고려 ARGV [2]에 대한 파일을 여는 중입니다. 사실 나는 ARGV [0]과 ARGV [1] 만 열어야합니다. ARGV [2] 나는 출력만을 위해 글쓰기를 계속했다. 응답을 감사하십시오. 감사합니다. .

0

아마 그 txt 파일의 한 줄에 멀티 팩 키워드가 있다고 생각합니다. 그래서 참조 용 코드 아래 :

my @keywords; 
open IN, "keywords.txt"; 
while(<IN>) { 
    if(/^(.+)$/) { 
     push(@keywords, $1); 
    } 
} 
close(IN); 

my @filelist=glob("*.txt"); 
foreach my $filename(@filelist) { 
    if(open my $fh, '<', $filename) { 
     my $ln=1; 
     while(my $line = <$fh>) { 
      foreach my $kw(@keywords) { 
       if($line=~/$kw/) { 
        print $filename.':'.$ln.':'.$kw."\n"; 
       } 
      } 
      $ln++; 
     } 
    } 
    close($fh); 
} 
+0

죄송합니다.이 코드는 오류를 반환합니다! '글로벌 기호 "$ i"는 명시 적 패키지 이름을 요구합니다. 글로벌 기호 "$ fh"에는 명시 적 패키지 이름이 필요합니다. –

+0

입력 오류입니다. 나는 그것을 바로 잡았다. – laojianke

0
좋아

하지만 난 여기에 주목 한 가지입니다 ..

키워드

http:// 
oracle.com 

는 전체 단어 일치되고, 대신 일치하도록해야 문자열의 일부로 .. 이러한 키워드 만 .. 위와 같이 검색해야합니다.