2013-08-16 209 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>; 
} 

最後一個print語句不希望打印的變量。即使我將其聲明爲「我們」,或者僅僅對此聲明發表評論。更奇怪的是,它只發生在第一次迭代。該文件有幾千條記錄,在第一次迭代時只有變量未定義。隨後的所有通話都很好。

任何想法是怎麼回事?

謝謝。

+0

什麼是'$ year'這裏?這是你的腳本的全文嗎? – Suic

+0

可能有一行沒有足夠的字段。 – choroba

+0

我真的很困惑爲什麼你需要在這裏聲明全局變量 – Suic

回答

0

您尚未提供足夠的信息供我們自己複製問題,但最有可能的情況是該文件的第一行沒有包含正在處理的任何$year正確格式的數據。也許第一行是頭文件?

另一種可能性是,$year可能不會在第一次通過while迴路設置,所以你永遠不會進入任何其設置$classwork,然後它被設置在迴路中的一個後點if塊。既然你沒有說明$year是在哪裏設置的,我們不能說這是否是問題。

爲了獲得最佳答案,通常最好提供完整的,可運行的示例代碼,以儘可能少的附加代碼來演示您的問題。 (根據我的經驗,這樣的例子通常不超過15-20行)。這樣做的另一個好處是,在找到演示它的最小可能程序的過程中,您經常會發現自己的問題。

此外,$classwork需要全球化沒有明顯的理由。在當前聲明中更改ourmy不應影響您所顯示的任何代碼,並且我肯定會考慮將my $classwork置於while循環內,除非有一些預期的條件不應在每次傳遞時重新分配,應該保持其價值從一個迭代到下一個。