0

我对 Perl 很陌生,我正在调整其他人的脚本来解析来自设备的日志文件。忽略脚本前面的任何奇怪之处,我遇到的问题是当它到达 for 循环中的最后一个打印语句时。如果我“使用警告”,而不是打印任何变量,我会收到警告:在第 34 和 35 行使用未初始化的变量。没有变量被初始化,但我不明白为什么。它们在 for 循环之前被初始化。这里发生了什么?

#!/usr/bin/perl
use warnings;

my $datafile = 'router-tcam-acl-out.log';
open DATAFILE, "<$datafile" or die "$datafile: $!";
my @data = <DATAFILE>;
close DATAFILE;
chomp @data;

print @data;

my ($dest_ip, $src_ip, $dest_port, $src_port, $tcp_flags, $protocol, $tos, $dest_mask, $src_mask, $result, $hit_cnt);

foreach my $data (@data) {
    if ($data =~ /^_V_\S+\s+(\S+,)\s+(\S+)\s+P=(\S+)\s+P=(\S+)\s+(\S+)\s+(\S+)\s+\S+\s+\S+\s+(\S+) /) {
            $dest_ip=$1;
            $src_ip=$2;
            $dest_port=$3;
            $src_port=$4;
            $tcp_flags=$5;
            $protocol=$6;
            $tos=$7;
            next;
        }
        elsif ($data =~ /_M \S+ (\S+) (\S+) /) {
            $dest_mask=$1;
            $src_mask=$2;
            next;
        }
        elsif ($data =~ /rtr\_rslt_(\S+) hit_cnt=(\S+) /) {
            $result=$1;
            $hit_cnt=$2
        }
        print "\n$src_ip,$src_mask,$src_port,$dest_ip,$dest_mask,$dest_port";
        print ",$protocol,$tos,$result,$hit_cnt";
        }
4

1 回答 1

2
my ($dest_ip, $src_ip, $dest_port, $src_port, $tcp_flags, $protocol, $tos, $dest_mask, $src_mask, $result, $hit_cnt);

声明了变量,它不初始化它们。我不确定在 perl 中是否有比my ($x, $y, ...) = (0, 0, ...)将其拆分成行更简单的方法,my $x = 0; my $y = 0; ...

于 2013-11-10T21:31:42.920 回答