为什么这不在范围内?为什么使用严格阻止这个?

Why isn't this in scope? Why is use strict blocking this?

语言是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 关键字来声明数组变量。我将 =~ 运算符的结果作为列表返回到数组中。在我尝试使用 perldata 中概述的 $#array 获取最后一个索引之前,我正在测试数组以确保它们中包含元素。

当我关闭严格时,它按预期工作。

我试过在将任何内容放入其中之前将它们预先声明为数组:

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

那也没用。

大多数关于此的答案都涉及范围界定错误,但我在这里看不到任何答案。有些涉及忘记用 my 声明变量,但我已经做到了。我见过一个涉及类型不匹配的问题,试图将标量视为数组。我找不到与此相关的任何内容。

所以我问:我在这里做错了什么?

strict 在这里工作。 2 个数组的声明与第 87 行和第 105 行中的拼写不同。

此外,您对数组 != 0 的检查将允许空数组 (== -1)。如果您要检查 1 个以上的元素,如果我理解您的意图,测试将是 >=1。也许您的意思是 @relAuthorList != 0(表示项目数为 1 或更多)。