Обновление Вопрос изменился.Первоначально цикл перешел к $k<=2
(размер массива не упоминался), к чему обратился этот ответ.Суть осталась, и теперь стало ясно, что цикл поднимается до индекса , равного размеру массива, так что один за забором;предел должен быть $k < $i
.Таким образом, " значение $k
, для которого нет упомянутого ниже элемента ", является последним зацикленным.
$checkpoint[$k]
, который выводит предупреждение в регулярном выражении, являются элементами массива @checkpoint
с индексами 0, 1, 2
- что $k
находится в цикле.
"Неинициализированное значение в пределах ... " означает, что массив @checkpoint
на самом деле не имеет всех этих элементов, поэтому для значения $k
, для которого нетelement, регулярное выражение пытается получить неопределенное значение и жалуется.
Первый split
, вероятно, вернул меньше трех элементов.Распечатайте @checkpoint
, чтобы увидеть.
Еще несколько комментариев
Пожалуйста всегда иметь use warnigs;
и use strict;
в началепрограммы
Используйте лексические файловые дескрипторы , поэтому открывайте файлы с помощью open my $name, ...
(не open NAME, ...
)
Для циклического перебора чисел из диапазона хорошим способом является
for my $k (0..2) { ... }
( update ) ... но вопрос изменился, с циклом (предназначенным для) по всем элементам массива, и тогда нет причин использовать индекс.Итерация непосредственно по элементам
foreach my $checkpoint (@checkpoints) { .... }
Всякий раз, когда вы используете \s+
для шаблона разделителя в split , скорее всего, вам следует использовать специальный шаблон ' '
,которая разбивается на \s+
, а также игнорирует начальные и конечные пробелы.