-1

これは素晴らしいことですが、理解できない部分があります。

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) =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
4

1 に答える 1

2

File::Tail::select見つかったファイルハンドルの数、何らかのタイムアウト方法、およびFile::Tailオブジェクトのリストを返します。これらは@pendingあなたのコードにあります。物事を印刷するときは@pending、新しい変数を明示的に作成せずに各メンバーをループするため、 の各要素が自動的@pendingに特別な変数に入れられ$_ます。

最初$_->{"input"}に、ある種の「入力」である を出力します (これが何であるかについてはドキュメントでは不明です)、タイムゾーンでの現在の時刻、およびファイルから読み取った文字列 ( $_->read)。

単に印刷$_しようとすると、オブジェクトを印刷しようとしているため、期待した結果が得られません (オブジェクトが文字列化をオーバーロードしない限りFile::Tail)。

とともにFile::Tailドキュメントを読むことをお勧めしperldoc perlvarます。

編集:File::Tailソースを調べたところ$_->{"input"}、オブジェクト指向 Perl の悪用はひどいものでした。これは実際には、オブジェクトの作成者に対するオブジェクトの内部表現ですname$_->{"input"}に変更して、適切にアクセスする必要があります$_->nameFile::Tailドキュメントがまさにこの構文を使用しているため、コードがこのように記述されているのはあなたのせいではありませんが、それは正しくないため、変更する必要があります。

于 2011-03-29T18:33:54.713 に答える