为什么我在这个perl脚本中收到有关未初始化变量的警告?

时间:2013-11-10 21:25:19

标签: regex perl

我是Perl的新手,我正在调整其他人的脚本来解析设备中的日志文件。忽略脚本中早期的任何怪异,我遇到的问题是它到达for循环中的最后一个print语句。如果我“使用警告”而不是打印任何变量,我会收到警告:在第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";
        }

1 个答案:

答案 0 :(得分: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; ...