2011-03-29 41 views
-1

這是偉大的是工作,但有一個部分我不明白:File :: Tail :: select是什麼意思?

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每個元素你循環就會自動放入特殊$_變量。

您首先打印的是$_->{"input"},這是某種輸入方式(文檔不清楚這是什麼),當前時區在您的時區以及從文件中讀取的字符串($_->read)。

如果你只是試圖打印出$_你試圖打印出一個對象,它不會給你預期的結果(除非對象超載字符串化,而不是File::Tail)。

我建議讀通過File::Tail documentation,與perldoc perlvar一起。

編輯:我翻遍了File::Tail source$_->{"input"}是對面向對象Perl的過度濫用。這實際上是對象的對象創建者參數name的內部表示。您應該通過將$_->{"input"}更改爲$_->name來正確訪問它。我注意到,這不是你的錯,你的代碼是這樣寫的,因爲File::Tail文檔使用的正是這種語法,但它是不正確的,應該改變。

+0

哦謝謝怎麼樣,如果我只想檢索目的地IP地址?我怎樣才能改變呢? – 2011-03-29 22:30:50

+0

@T_y:你得問另外一個問題。這不是評論中容易回答的問題。 – CanSpice 2011-03-29 22:33:27