2013-08-16 3 views
-2

, 전역 변수를 올바르게 선언하려면 어떻게해야합니까? ALL

코드의이 조각 고려 :

our $classwork = 0; 
while(<INFILE>) 
{ 
    chomp; 
    next if $. == 1; 
    if($year >= 1992 && $year <= 1995) 
    { 
     $classwork = (split(/,/))[6]; 
     print "Classwork is: ", $classwork, "\n"; 
    } 
    if($year >= 1996 && $year <= 2001) 
    { 
     $classwork = (split(/,/))[-1]; 
    } 
    print "Classwork is: ", $classwork, "\n"; 
    if($year == 2002) 
    { 
     $classwork = (split(/,/))[-2]; 
    } 
    if($year == 2003 || $year == 2004) 
    { 
     $classwork = (split(/,/))[23]; 
    } 
    if($year >= 2005 && $year <= 2009) 
    { 
     $classwork = (split(/,/))[22]; 
    } 
    if($year >= 2010 && $year <= 2012) 
    { 
     $classwork = (split(/,/))[20]; 
    } 
    print "Classwork is: ", $classwork, "\n"; 
    $line = <STDIN>; 
} 

마지막 인쇄 문은 변수를 인쇄 할하지 않습니다. 내가 '우리'라고 선언하거나 선언문에 주석을 달아도. 더 이상한 것은 첫 번째 반복에서만 발생한다는 것입니다. 파일에는 수천 개의 레코드가 있고 첫 번째 반복에는 변수 만 정의되지 않습니다. 이후의 모든 통화는 양호합니다.

어떤 생각이 벌어지고 있습니까?

감사합니다.

+0

여기에'$ year'은 무엇입니까? 이 스크립트의 전체 텍스트입니까? – Suic

+0

필드가 충분하지 않은 행이있을 수 있습니다. – choroba

+0

그리고 전 왜 전역 변수를 선언해야하는지 혼란 스럽습니다. – Suic

답변

0

Google에서 직접 문제를 재현하기에 충분한 정보를 제공하지는 않았지만 가장 일반적인 경우는 파일의 첫 번째 줄에 처리하려는 $year에 대한 올바른 형식의 데이터가 포함되어 있지 않은 경우입니다. 아마도 첫 번째 줄이 머리말일까요?

또 다른 가능성은 당신이 $classwork을 설정하고이 루프에서 나중에 설정 가져옵니다 if 블록 중 하나를 입력하지 않도록 $year에서, while 루프를 통해 첫 번째 패스에 설정되지 않을 수 있다는 점이다. $year이 설정된 위치 나 방법을 표시하지 않으므로 문제가 될 수 있는지 여부는 말할 수 없습니다.

가능한 가장 좋은 답변을 얻으려면 가능한 한 추가 코드를 사용하지 않고 문제를 나타내는 완전한 실행 가능한 예제 코드를 제공하는 것이 가장 좋습니다. (내 경험에 비추어 볼 때 그러한 예는 일반적으로 15-20 라인을 넘지 않습니다.)이 작업을 수행하는 또 다른 이점은 시연 할 수있는 가장 작은 프로그램을 찾는 과정에서 자주 문제를 발견 할 수 있다는 것입니다.

또한 $classwork이 전역 적이어야하는 이유가 분명하지 않습니다. our에서 my으로 변경하면 현재 표시된 코드에 영향을 미치지 않아야하며 모든 패스와 코드에서 다시 할당해서는 안되는 일부 의도 된 조건이없는 한 my $classworkwhile 루프 내부로 이동하는 것이 좋습니다. 대신 하나의 반복에서 다음 반복까지 값을 유지해야합니다.

관련 문제