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

时间:2016-12-16 03:38:20

标签: arrays perl scope strict

语言是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声明变量,但我已经这样做了。我见过一个涉及类型不匹配的问题,试图将标量视为数组。我找不到与此相关的任何内容。

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

1 个答案:

答案 0 :(得分:2)

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

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