2011-11-01 19 views
0

可能有人親切地指出我爲什麼這個片段不編譯:編譯錯誤而定義的變量範圍

my $crond = "/etc/init.d/crond"; 
if(-e $crond) { 
    my $d = "d"; 
} 
my $crond = "/etc/init.d/cron$d"; 

錯誤:

"my" variable $crond masks earlier declaration in same scope at /home/andrew/sandbox/processes2cron.pl line 27. 
Global symbol "$d" requires explicit package name at /home/andrew/sandbox/processes2cron.pl line 27. 

我試圖與「我的」,但還是範圍不同變化被不正確地定義。謝謝。

+1

你可以說['使用診斷;'](http://perldoc.perl.org/diagnostics.html)產生更詳細的警告/錯誤 –

回答

4
my $crond = "/etc/init.d/crond"; 
my $d; 
if(-e $crond) { 
    $d = "d"; 
} 
$crond = "/etc/init.d/cron$d"; 

正如錯誤信息所示。您在同一範圍內重新聲明$cron,並且$d僅在if塊中定義,因此編譯器期望$d在最後一行上使用時爲全局變量,並在找不到它時發出抱怨。

+0

謝謝,這使我的一天) – Andrew

5

您已經在代碼的第一行聲明瞭變量$crond。通過在第5行重新聲明,您將失去先前的值。在這種情況下,刪除第5行中的my將停止警告。

變量$d在if塊的範圍內聲明。這意味着它只能在if塊結束之前訪問。然後嘗試在if塊外引用它,這會導致錯誤。要解決此問題,請在外部作用域中的if語句之前聲明$d

+0

謝謝!我應該閱讀更多關於名稱範圍的內容 – Andrew