2012-11-16 49 views
3

所以,我是Perl的新手。我試圖創建一個遞歸子例程。邏輯似乎很簡單:Perl函數中的變量在函數外有一個意外的值

sub directory_tree 
{ 
    my $sth = $dbh->prepare(" 
     SELECT id, org_id, name 
     FROM media_directories 
     WHERE 
      org_id = ? 
      AND parent = ? 
      AND bucket = ? 
    "); 
    $sth->bind_param(1, $_[0]); 
    $sth->bind_param(2, $_[1]); 
    $sth->bind_param(3, 'mfsermons.myflock2.com'); 
    $sth->execute; 

    $result = ''; 
    while(my($id, $org_id, $name) = $sth->fetchrow_array()) 
    { 
     $result .= "<option value='$id'>$name</option>"; #377 
     $result .= directory_tree($org_id, $id);   #378 
    } 

    return $result; 
} 

$directory_tree = '<select name="folder">'; 
$directory_tree .= directory_tree($churchid, 0); 
$directory_tree .= '</select>'; 

爲什麼,當我行377後打印$result,它等於預期值,但是當我將它打印在378線,似乎沒有什麼?不應該。=運算符只是再次運行該函數,然後追加到值?

我最好的猜測是Perl中有一些範圍問題我不明白,特別是關於$result。但是,在我的生活中,我無法弄清楚什麼是錯誤的,我完全不知道該往哪裏看!

當我打開錯誤報告,致命和警告時,什麼也沒有返回。我錯過了什麼可能會出錯?

+9

'使用嚴格',避免全局變量。 – choroba

+2

夥計,加上'my'修好了!在子程序中創建時,我完全不知道變量是全局默認的。謝謝!如果您想發佈答案,我會將其標記爲最佳答案! – Nathanael

+1

@choroba,你會做出答案嗎? – ikegami

回答

5

use strict,避免全局變量。換句話說:您正在重新使用全局$result,在每次調用子例程時重置其值。