2012-11-16 2 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

'use strict'는 전역 변수를 사용하지 않습니다. – choroba

+2

야, 내 '고정'추가! 변수가 서브 루틴 내부에서 생성 될 때 기본적으로 전역 변수라는 사실을 전혀 알지 못했습니다. 감사! 답변을 게시하려면 가장 좋은 답변으로 표시하겠습니다. – Nathanael

+1

@ choroba, 대답 할거야? – ikegami

답변

5

use strict 전역 변수를 사용하지 마십시오. 즉, 글로벌 $result을 재사용하고 서브 루틴 호출 할 때마다 해당 값을 재설정합니다.

관련 문제