0

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 

これらのエラーはどういう意味ですか?

4

1 に答える 1

2

スコープの問題が原因で、これらのエラーが発生しています。一枚目見てみろよ

Global symbol "$i" requires explicit package name at

最初$iに行で定義します

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

ただし、後でその for ループの外で使用してみてください。Perl はこれらのエラーを表示しています (おそらく、strict を適切に使用しているためです)$iは for ループ内でのみ定義されているためです。

<%init>これを修正するには、これらの変数定義をスコープ付きループの外、つまり宣言の直後に移動します。

my $i
my $foundFeature
...
于 2014-07-23T14:46:40.757 に答える