Как сделать инициализированное значение с помощью @array при компиляции regrep - PullRequest
1 голос
/ 02 мая 2019

я пытаюсь запустить этот код,

@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]|||||  ";
                    } }

но в результате предупреждения сказано:

«Использовать неинициализированное значение в @checkpoint при компиляции регулярного выражения в строке new3.pl 64 (# 2)», а строка 64 - «if ($ array_ARGVTEMP [$ d] = ~ m / $ checkpoint [$ k] / i» ) "

Пожалуйста, помогите мне, спасибо

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

@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)
2 голосов
/ 02 мая 2019

Обновление Вопрос изменился.Первоначально цикл перешел к $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+, а также игнорирует начальные и конечные пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...