如何在regrep编译中使用@array中的初始化值

时间:2019-05-02 04:25:09

标签: perl

我尝试运行此代码行,

@checkpoint = split (/\s+/,$array_lcp[0]);
$i=scalar @checkpoint
print NAME " $checkpoint[0] ";
for ($k=0; $k<=i; $k++)
{
if ($array_ARGVTEMP[$d] =~ m/$checkpoint[$k]/i)
                    {
                            @array = split (/\s+/,$array_ARGVTEMP[$d]);
                            print NAME "   $checkpoint[$k]|  $k|| 
                            $checkpoint[0]|||  $checkpoint[1] ||||$checkpoint[2]|||||  ";
                    } }

但是在结果警告中,它表示:

“在new3.pl第64行(#2)的regexp编译中@checkpoint中使用未初始化的值”和第64行为“ if($ array_ARGVTEMP [$ d] =〜m / $ checkpoint [$ k] / i )“

请帮助我,谢谢

2 个答案:

答案 0 :(得分:2)

更新。问题已更改。最初,循环到达$k<=2(未提及数组大小),此答案解决了这个问题。要点仍然存在,现在很明显,循环上升到与数组大小相等的索引 equal ,所以越过了围栏;限制应为$k < $i。因此,下面提到的“没有元素的$k”是最后一个循环的值。


在正则表达式中发出警告的$checkpoint[$k]是具有索引@checkpoint的数组0, 1, 2的元素-循环中的$k

“ ...内的未初始化值”表示数组@checkpoint实际上没有所有这些元素,因此对于值为$k的数组regex不会尝试检索未定义的值并抱怨。

第一个split可能返回的元素少于三个。打印出@checkpoint来查看。

更多评论

  • 始终在程序开始时同时使用use warnigs;use strict;

  • 使用词汇文件句柄,因此请使用open my $name, ...(而非open NAME, ...)打开文件

  • 要循环遍历某个范围内的数字,一种很好的方法是

    for my $k (0..2) { ... }
    
  • update )。。。但是问题改变了,所有数组元素上都出现了循环(原意是),因此没有理由使用索引。直接遍历元素

    foreach my $checkpoint (@checkpoints) { .... }
    
  • 每当您在split中将\s+用作分隔符模式时,最有可能应该使用特殊的' '模式,该模式会被\s+分割并且也无视前导和尾随空间。

答案 1 :(得分:2)

@checkpoint$i个元素,编号为0$i-1,但是您正在访问索引为$i的元素。

for (my $k=0; $k<=$i; $k++)

应该是

for (my $k=0; $k<$i; $k++)

实际上应该是

for my $k (0..$#checkpoints)

实际上应该是

for my $checkpoint (@checkpoints)