【问题标题】:File::Tail::select mean?File::Tail::select 是什么意思?
【发布时间】:2011-03-29 18:08:47
【问题描述】:

这很好,它是工作,但有一部分我不明白:

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

【问题讨论】:

    标签: perl filehandle


    【解决方案1】:

    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 文档使用的正是这种语法,但它不正确,应该更改。

    【讨论】:

    • 哦,谢谢,如果我只想检索目标 IP 地址怎么样?如何修改它?
    • @T_y:您将不得不就此提出另一个问题。这不是评论中容易回答的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2012-07-03
    • 2014-11-25
    相关资源
    最近更新 更多