2016-12-16 65 views
0

该语言是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获取最后一个索引之前,我正在测试这些数组以确保它们中有元素。

当我严格禁用时,它按预期工作。

我已经试过predeclaring他们作为阵列之前,我把所有的内容在其中:

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

这也不能工作。

围绕此问题的大部分答案都涉及范围错误,但我无法看到我在此处做出的任何答案。一些涉及忘记与my宣布一个变量,但我已经做到了。我看到一个涉及类型不匹配的尝试将一个标量视为一个数组。我找不到与此相关的任何内容。

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

+0

'[]'创建一个空数组的引用。 '我的@array;'足以初始化一个数组。 –

+0

由于简单的印刷错误,我正在投票关闭这个题目。 –

+5

比较:'@ relAuthorList'与'@ relAuthorlList'和'@ metaAuthorList'与'@ metaAuthorlList'(在“作者”之后的多余“l”)。 – ThisSuitIsBlackNot

回答

2

严格在这里工作。 2阵列的声明拼写与拼写不同,在行87和105.

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

+1

或只是'if(@relAuthorList)' – ikegami

+0

谢谢。显然,我来这里是为了喜剧! – user1522444

+0

我说骆驼案件使它更难以发现这一点。变数名称是我们不喜欢骆驼的唯一地方。这就是为什么Perl的最佳做法建议使用snake案例,这会使你的var'@ rel_author_list',而你的错字将会是'@ rel_authorl_list'。这将更容易发现。 – simbabque