在模式匹配中使用未初始化的值(m //)?

时间:2013-08-29 18:30:47

标签: regex string perl matching

我已经查看了有关此问题的其他答案,但我仍然不确定为什么会出现此问题:在模式匹配中使用未初始化的值(m //)

my $curr = 0;
my (@up_intf, @nh_ID);
my $line = "";
for (my $index = 0; $index < length(@lines); $index++) {
       $line = $lines[$index];
       print("The line is: $line");
       if (($line =~ /^Group:/i)) {
          while (1) {
             if (($line =~ /^Uptime:/i)) { last; }
             else {
               $index++;
               $line = $lines[$index];
               if (($line =~ /^Downstream/i)) {
                  $index++;
                  $line = $lines[$index];
                  print($line);
                  $up_intf[$curr] = $line;
               }
               if (($line =~ /^Next-hop/i)) {
                  $nh_ID[$curr] = substr($line, 13, ((length($line) - 13)));
                  print($line);
                  $curr++;
               }
              }
            }
        }
}

谢谢!

1 个答案:

答案 0 :(得分:3)

你的循环应该是:

for (my $index = 0; $index < $#lines; $index++) {

还有很多其他问题,但这是一个起点。

$#lines给出@lines的最后一个索引,而scalar @lines给出@lines中的元素数量。 length @lines没有按照您的想法行事。

看着你的循环:

           if (($line =~ /^Downstream/i)) {
              $index++;
              $line = $lines[$index];
              print($line);
              $up_intf[$curr] = $line;
           }

如果最后一行与/^Downstream/i匹配怎么办?然后,您将未定义的值分配给$line,然后继续:

          if (($line =~ /^Next-hop/i)) {
              $nh_ID[$curr] = substr($line, 13, ((length($line) - 13)));
              print($line);
              $curr++;
           }

你会得到警告。

由于缺乏更好的术语,你正在进行处理的方式很糟糕。