2014-07-23 2 views
0

perl에서 중첩 데이터 (매우 복잡한) 데이터 구조에 액세스하는 코드를 작성했습니다.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 

이러한 오류는 무엇을 의미합니까?

+0

를 선언 어떤 루프 범위의 외부에서이 그 변수 정의를 이동 고정하고'strict' 오류가 무슨 뜻인지하지 않으려면? 또한, 이것은 Perl 코드가 아니며, 다른 도구에서 Perl 코드를 작성하는 데 사용됩니다. – TLP

+2

@TLP, 메이슨처럼 보입니다. – friedo

+0

당신은 펄 모듈에'logic'을 두어야하고'Mason component'는 모듈을 호출하고 것들을 테스팅합니다. 그것이 모듈이라면, 디버그하는 것이 훨씬 쉽습니다. 그리고 오래된'HTML :: Mason'을'Mason'으로 변환하려고 시도했지만, 차이점을 알아야합니다. '% args'는'Mason'에서 사라졌습니다 (https : //metacpan.org/pod/distribution/Mason/lib/Mason/Manual/UpgradingFromMason1.pod) – jm666

답변

2

범위 지정 문제로 인해 이러한 오류가 발생합니다. 당신은 처음에 라인

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

$i를 정의하지만 나중에 for 루프의 외부에서 사용하려고 처음

Global symbol "$i" requires explicit package name at 

를 살펴 보자. Perl은 $i이 for 루프 내에서만 정의되기 때문에 이러한 오류를 줄 것입니다 (아마도 여러분이 엄격하게 사용해야하므로).

, 즉 즉시 <%init> 후 당신이 그 코드를 작성했습니다 어떻게

my $i 
my $foundFeature 
... 
+2

사실'$ i'는 관련 값만 가지고 있습니다 for-loop 내부에서는 루프 내에서 사용법을 이동시키는 것이 솔루션이며 범위를 늘림으로써 절대적으로 사용하지는 않습니다. 그러면 오류를 숨길 수 있습니다. 이는 사용자가 원하는 것과 반대입니다. – TLP

관련 문제