我尝试运行此代码行,
@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 )“
请帮助我,谢谢
答案 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)