2011-03-29 1 views
-1
이는 작품 좋은,하지만 난 이해가 안 한 부분이있다

:File :: Tail :: select mean?

print $_->{"input"}." (".localtime(time).") ".$_-> read; 

이 무엇을 인쇄 않습니다를? 수정 한 경우 :

print "$_"; 

일부 오류가 있습니다. 왜?

#!/usr/local/bin/perl 

use File::Tail; 
chdir("/var/log/snort"); 
foreach my $fol(glob "*.*.*.*") 
{ 
     print "Opening $fol\n"; 
     chdir("/var/log/snort/$fol"); 
     foreach my $subfile(glob "*:*") 
     { 
       print "opening $subfile\n"; 
       push(@files,File::Tail->new(name=>"$subfile",debug=>$debug)); 
     } 
     while (1) 
     { 
       ($nfound,$timeleft,@pending)= File::Tail::select(undef,undef,undef,$timeout,@files); 
       unless ($nfound) 
       { 
        # timeout - do something else here, if you need to 
       } 
       else 
       { 
         foreach (@pending) 
         { 
           print $_->{"input"}." (".localtime(time).") ".$_-> read; 
         } 
       } 
     } 
} 

예를 들어 결과 :

TCP:34628-80 (Wed Mar 30 01:49:57 2011) 03/30-01:49:50.607858 119.40.116.196:80 -> 192.168.242.133:34628 
TCP:34628-80 (Wed Mar 30 01:49:57 2011) TCP TTL:128 TOS:0x0 ID:34869 IpLen:20 DgmLen:40 
TCP:34629-80 (Wed Mar 30 01:49:57 2011) 03/30-01:49:51.309716 119.40.116.196:80 -> 192.168.242.133:34629 
UDP:41415-53 (Wed Mar 30 01:49:57 2011) 03/30-01:49:47.220999 192.168.242.2:53 -> 192.168.242.133:41415 
UDP:44705-53 (Wed Mar 30 01:49:57 2011) 03/30-01:49:47.427011 192.168.242.2:53 -> 192.168.242.133:44705 
UDP:50539-53 (Wed Mar 30 01:49:57 2011) 03/30-01:49:47.213455 192.168.242.2:53 -> 192.168.242.133:50539 
TCP:34628-80 (Wed Mar 30 01:49:57 2011) ***AP**F Seq: 0x2F3E700A Ack: 0x2359814F Win: 0xFAF0 TcpLen: 20 
TCP:34629-80 (Wed Mar 30 01:49:57 2011) TCP TTL:128 TOS:0x0 ID:34871 IpLen:20 DgmLen:40 
UDP:41415-53 (Wed Mar 30 01:49:57 2011) UDP TTL:128 TOS:0x0 ID:34859 IpLen:20 DgmLen:65 
UDP:44705-53 (Wed Mar 30 01:49:57 2011) UDP TTL:128 TOS:0x0 ID:34861 IpLen:20 DgmLen:153 
UDP:50539-53 (Wed Mar 30 01:49:57 2011) UDP TTL:128 TOS:0x0 ID:34857 IpLen:20 DgmLen:179 
TCP:34628-80 (Wed Mar 30 01:49:57 2011) =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 
TCP:34629-80 (Wed Mar 30 01:49:57 2011) ***AP**F Seq: 0x9D70418 Ack: 0x248089DB Win: 0xFAF0 TcpLen: 20 
UDP:41415-53 (Wed Mar 30 01:49:57 2011) Len: 37 
UDP:44705-53 (Wed Mar 30 01:49:57 2011) Len: 125 
UDP:50539-53 (Wed Mar 30 01:49:57 2011) Len: 151 
TCP:34628-80 (Wed Mar 30 01:49:57 2011) 
TCP:34629-80 (Wed Mar 30 01:49:57 2011) =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 

답변

2

File::Tail::select 발견 파일 핸들의 수, 타임 아웃의 일부 방식, 그리고 File::Tail 개체의 목록을 반환합니다. 이 코드는 @pending에 있습니다. 인쇄물을 인쇄 할 때 @pending의 각 멤버를 명시 적으로 새로 만들지 않고 각 멤버를 반복하므로 @pending의 각 요소는 $_ 변수에 자동으로 입력됩니다.

"입력"(문서가 무엇인지 명확하지 않음), 시간대의 현재 시간 및 파일에서 읽은 문자열 ($_->read)의 몇 가지 방법 인 $_->{"input"}을 먼저 인쇄하십시오.

$_을 인쇄하려고하면 개체가 인쇄하려고하는 경우 예상되는 결과를 얻지 못합니다 (해당 개체의 문자열이 과부하되지 않는 한 File::Tail은 해당하지 않음).

나는 과 함께 File::Tail documentation을 통해 읽을 것을 권합니다.

편집 : File::Tail source을 살펴본 결과, $_->{"input"}은 객체 지향 Perl의 심각한 남용입니다. 이것은 실제로 오브젝트 작성자에 대한 name 매개 변수의 오브젝트 내부 표현입니다. $_->{"input"}$_->name으로 변경하여 올바르게 액세스해야합니다. File::Tail 설명서에서이 구문을 정확하게 사용하기 때문에 코드가 이렇게 쓰여진 것이 자신의 잘못이 아니라는 점에 유의하십시오. 그러나 잘못되었으므로 변경해야합니다.

+0

오 목적지 IP 주소를 검색하고 싶다면 어떨까요? 어떻게 수정할 수 있습니까? –

+0

@T_y : 그것에 대해 다른 질문을해야 할 것입니다. 그것은 코멘트에서 쉽게 대답하는 것이 아닙니다. – CanSpice