读取和连接行直到在 Perl 中找到特定值

问题描述

早上好,

我正在重新设计由外部软件供应商设计的 Perl 脚本。它使用我以前从未写过的 Perl。基本上它所做的就是读入一行,然后将系统日志数据包发送到包含该行的目标主机。我需要修改它,以便 Perl 将继续阅读和连接,直到它到达“”。问题是,它在给定文件的第一行循环,因此永远不会到达发送阶段。有什么指导吗?回去又看了一遍原脚本,貌似没有遍历每一行的机制。

编辑:好的 - 显然我已经变得愚蠢并且无法理解基本的迭代逻辑。修复了循环问题,现在修复syslog发送问题。它正确读取数据,但从不执行syslog发送请求,这意味着它没有进入if语句。

程序最终应该在这里输入:if($lineRead eq $check){//do something;}

#!/usr/bin/perl -w

use strict;
use warnings;

use lib qw(.);
use lib qw(<removed>);

use Syslog;
use Time::HiRes qw( time sleep usleep );
use Getopt::Std;

# create log entries at a fixed rate (n per sec)
# Option defautls

my $me = $0;
$me =~ s|.*/||;

my %options = (
        d       =>      "127.0.0.1",# host
        p       =>      514,# port
        f       =>      "readme.syslog",# filename
        b       =>      0,# burst
        v       =>      0,# verbose
        t       =>      0,# tcp vs. udp
        l       =>      0,# loop option
#       u       =>      "127.0.0.2",# new IP to send
);

my $theProto='tcp';

# Help
sub HELP_MESSAGE {
        print <<EOF;
$me [-d <host>] [-p <port>] [-f filename] [-u <IP>] [-l] [-t] [-b] [-n NAME] [-v] <messages per second>
Options:
-d : destination syslog host (default 127.0.0.1)
-p : destination port (default 514)
-f : filename to read (default readme.syslog)
-b : burst the same message for 20% of the delay time
-t : use TCP instead of UDP for sending syslogs
-v : verbose,display lines read in from file
-n : use NAME for object name in syslog header
-l : loop indefinately
-u : use this IP as spoofed sender (default is NOT to send IP header)
EOF
}

getopts('vbtlu:d:p:n:f:',\%options);

unless (@ARGV) {
        print STDERR "Need an event rate.\n";
        HELP_MESSAGE;
        exit 1;
}

my $nmsg = shift @ARGV;

if (!($nmsg =~ /^\d+$/)) {
        print "Invalid number of messages per second.\n";
        HELP_MESSAGE;
        exit 1;
}

if ($options{t}) { $theProto='tcp'; }

my $syslog = new Syslog(
        name     => $options{n},# prog name for syslog header
        facility => 'local6',priority => 'info',loghost  => $options{d},port     => $options{p},proto    => $theProto,);

sub doitall() { # for purpose of infinate looping

open(F,$options{f}) or die("Unable to open file: $options{f}\n");

print STDERR "generating $nmsg messages per second to $options{d}:$options{p}\n";
print STDERR "Ctrl-c to stop\n";

# delay in milliseconds
my $delay = 1.0/$nmsg;
my $resolution = 0.2;
my $burst = $nmsg * $resolution;

my $check = "</Event>";
my $lineRead;
my $payload="a";
if ($options{b}) {
    print "Sending $burst messages every ",int ($delay * 1000),"ms\n";
}

while (<F>) {
        #print $lineRead;
        if ($options{v}) {
            print "Read in: $_\n";
        }
        $lineRead=$_;
        if($lineRead eq $check){
                $payload = join $payload,$lineRead;
                if ($options{b}) {
                    for (my $i = 0 ; $i < $burst; $i++) {
                        if ($options{u}) { print $payload; $syslog->send($payload,host=> $options{u}); }
                        else { print $payload; $syslog->send($payload); }
                 }
                } else {
                 if ($options{u}) { print $payload; $syslog->send($payload,host=> $options{u}); }
                 else { print $payload; $syslog->send($payload); }
                }
                if ($delay > 0) {
                        if ($options{v}) {
                            print "waiting for ",int($delay * 1000),"ms ...\n";
                        }
                        usleep (1000000*$delay);
                }
                $lineRead = "a";
                $payload = "a";
        }
        else{
                $payload = join $payload,$lineRead;
        }
}

close(F);
} # end of the subroutine

if ($options{l}) {
        while (1) { doitall(); }
} else { doitall(); }
exit 0;



解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)