Почему это не по объему? Почему используется строгая блокировка этого?

Язык Perl.

#!/usr/bin/perl

use strict;
[...]
while ( my $res = $async->wait_for_next_response )
{
    [...]
    if ($res->is_success)
    {
        [...]
        my @relAuthorList = ($res->content =~ /<a +rel=\"author\" +href=\".*?\".*?>.*?<\/a>/gi);
        if (@relAuthorList)
        {
            if ($#relAuthorlList != 0) # Line 87
            {
                [...]
            }
            [...]
        }
        my @metaAuthorList = ($res->content =~ /<meta +name=\"author\" +content=\".*?\" *?>/gi);
        if (@metaAuthorList)
        {
            if ($#metaAuthorlList != 0) # Line 105
            {
                [...]
            }
            [...]
        }
        [...]
    }
    [...]
}

Когда я запускаю его, я получаю следующие ошибки:

$ ./findAuthorCanonical
Global symbol "@relAuthorlList" requires explicit package name at ./findAuthorCanonical line 87.
Global symbol "@metaAuthorlList" requires explicit package name at ./findAuthorCanonical line 105.
Execution of ./findAuthorCanonical aborted due to compilation errors.
$

Я в тупике. Строгий включен. Я использую my ключевое слово для объявления переменных массива. Я возвращаю результаты из =~ оператор как списки в массивы. Я проверяю массивы, чтобы убедиться, что в них есть элементы, прежде чем пытаться получить последний индекс, используя $#array как указано в perldata.

Когда я выключаю строго, все работает как положено.

Я пытался предварительно определить их как массивы, прежде чем помещать в них какое-либо содержимое:

my @relAuthorList = [];
my @metaAuthorList = [];

Это тоже не сработало.

Большинство ответов на этот вопрос связаны с ошибками, но я не вижу ни одного, что я сделал здесь. Некоторые включают забыть объявить переменную с my но я сделал это Я видел один, который включает несоответствие типов, пытаясь рассматривать скаляр как массив. Я не мог найти ничего подходящего для этого.

Поэтому я спрашиваю: что я здесь не так делаю?

1 ответ

Решение

Строго здесь работал. Объявление двух массивов пишется иначе, чем их написание в строках 87 и 105.

Кроме того, ваши проверки для массивов != 0 позволит пустой массив (== -1). Если вы проверяете более 1 элемента, тест будет >=1 если я понимаю ваше намерение здесь. Может быть, вы имели в виду @relAuthorList != 0 (в котором говорится, что количество предметов равно 1 или более).

Другие вопросы по тегам