【问题标题】:Perl error global symbol requires explicit package namePerl 错误全局符号需要显式包名
【发布时间】:2014-07-23 14:29:04
【问题描述】:

我已经编写了一个代码来访问 perl 中的嵌套数据(非常复杂)数据结构。

<%method searchFeatureInFG>
<%args>
$featureGroup
$featureNameHash
</%args>
<%init>
my $foundFeature = 0;
my $foundGroup = undef;
my $foundIndex = undef;
if(defined $featureGroup && defined $featureNameHash){
  for(my $i = 0; $i < @$featureGroup; $i++){
    #print "<pre>".Data::Dumper::Dumper($featureGroup->[$i]->{'features'})."</pre>";
    if(ref($featureGroup->[$i]) eq 'HASH'){
        if(defined $featureNameHash->{$featureGroup->[$i]->{'name'}}){
            $foundGroup = $featureGroup;
            $foundIndex = $i;
            $foundFeature = 1;
        }
        elsif(defined $featureGroup->[$i]->{'features'}){
          for(my $j = 0; $j<scalar @{$featureGroup->[$i]->{'features'}} ; $j++){
            for(my $k=0;$k<scalar @{$featureGroup->[$i]->{'features'}->[$j]->{'features'}};$k++) {
                if (defined $featureGroup->[$i]->{'features'}->[$j]->{'features'}->[$k]->{'name'}) {
                     print $featureGroup->[$i]->{'features'}->[$j]->{'features'}->[$k]->{'name'}."\n";
                    }
            }
            last if !defined $featureGroup->[$i+1]->{'features'};
            }
    }
    }
    }elsif(defined $featureNameHash->{$featureGroup->[$i]}){
            $foundFeature = 1;
            $foundGroup = $featureGroup;
            $foundIndex = $i;
    }
    last if($foundFeature);
  }
}
return ($foundFeature, $foundGroup, $foundIndex);

</%init>
</%method>

这给了我如下错误。

Global symbol "$i" requires explicit package name at
Global symbol "$foundFeature" requires explicit package name at 
Global symbol "$foundGroup" requires explicit package name at 
Global symbol "$featureGroup" requires explicit package name at
Global symbol "$foundIndex" requires explicit package name at 

这些错误是什么意思?

【问题讨论】:

  • 你怎么能写了这段代码却不知道strict 错误是什么意思?另外,这不是 Perl 代码,它是在其他工具中用于创建 Perl 代码的东西。
  • @TLP,它看起来像梅森。
  • 您应该将logic 放入一个perl 模块中,并且在Mason component 中只调用该模块并执行模板操作。如果它是一个模块,它更容易调试。您正在尝试将旧的 HTML::Mason 转换为 Mason,但您应该了解其中的差异。 %args 已从 Mason 消失(阅读:metacpan.org/pod/distribution/Mason/lib/Mason/Manual/…

标签: perl mason


【解决方案1】:

由于范围界定问题,您会收到这些错误。看看第一个

Global symbol "$i" requires explicit package name at

您最初在该行中定义$i

  for(my $i = 0; $i < @$featureGroup; $i++){

但是稍后尝试在该 for 循环之外使用它。 Perl 给你这些错误(可能是因为你使用了你应该使用的 strict),因为 $i 只在 for 循环中定义。

要解决此问题,请将这些变量定义移到任何范围循环之外,即紧跟在 &lt;%init&gt; 声明之后

my $i
my $foundFeature
...

【讨论】:

  • 其实$i在for循环内部只有一个相关的值,所以解决方法是把用法移到循环内部,绝对通过扩大范围.这只会隐藏错误,这与您想要的相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多