【问题标题】:Why isn't this in scope? Why is use strict blocking this?为什么不在范围内?为什么要使用严格阻止这个?
【发布时间】:2017-05-01 19:23:48
【问题描述】:

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

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

【问题讨论】:

  • [] 创建对空数组的引用。 my @array; 足以初始化一个数组。
  • 由于一个简单的印刷错误,我投票决定将此作为题外话结束。
  • 比较:@relAuthorList@relAuthorlList@metaAuthorList@metaAuthorlList(“作者”之后的额外“l”)。
  • :) 只需信任错误消息即可。

标签: arrays perl scope strict


【解决方案1】:

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

此外,您对数组 != 0 的检查将允许一个空数组 (== -1)。如果您检查的元素超过 1 个,如果我在这里理解您的意图,则测试将是 &gt;=1。也许您的意思是 @relAuthorList != 0(表示项目数为 1 或更多)。

【讨论】:

  • 或者只是if (@relAuthorList )
  • 谢谢。显然,我来这里是为了喜剧解脱!
  • 我说骆驼案让我们更难发现这一点。变量名是我们唯一不喜欢骆驼的地方。这就是为什么 Perl 最佳实践建议改用蛇形大小写,这使您的 var @rel_author_list,而您的错字将是 @rel_authorl_list。那会更容易被发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2022-08-10
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多