2016-07-25 5 views
2

나는 Perl과 C에서 두 개의 코드 섹션을 가지고있다. 이것은 Perl의 my 변수와 C의 자동 변수에 관한 것이다. 어느 정도까지는 기능에 들어갈 때마다 초기화된다는 점에서 상당히 유사합니다. 그러나 Perl은 서브 루틴 변수 my을 참조 할 수 있습니다. 반환하면 함수 호출 스택이 파괴되므로 C가 임의의 값을 가져옵니다. Perl이이 기능을 구현하는 방법을 아는 사람은 누구입니까? 그것은 모든 서브 루틴 호출 스택을 그대로 유지할 수 없습니다. Perl은 "데이터 세그먼트"(스택과 비교)의 서브 루틴에서 생성 된 모든 my 변수를 할당합니다.Perl은 서브 루틴의 private 변수에 대한 전역 참조를 어떻게 구현합니까?

펄 코드 :

use strict; 
use warnings; 

my $ref; 

sub func 
{ 
    my $str = "hello"; 
    $ref = \$str; 
} 
func; 
print "value is "; 
print "${$ref}\n"; 

C 코드 :

#include <stdio.h> 

int *pi; 

void func(void) 
{ 
    int j = 9; 
    pi = &j; 
} 

int main(void) 
{ 
    func(); 
    printf("value is "); 
    printf("%d\n", *pi); 
    return 0; 
} 

감사합니다, 당신은 함수에서 로컬로 생성 된 일부 데이터에 참조에 전역 변수를 설정하는

답변

0

.

Perl ("관리되는 메모리"언어)에서 이것은 모든 참조가 사라질 때까지 가비지 수집되지 않을 참조 카운트 된 "개체"입니다 (여기서 문자열이므로 느슨하게 사용합니다).

C에서 이것은 메모리 주소 일 뿐이며 유효한 것으로 유지되어야하며 함수가 반환되는 즉시 이미 회수 된 스택 공간을 가리 키지 않아야합니다.

+0

안녕하세요 @ Thilo 참조 카운트를 서브 루틴의 내 변수에 사용할 수있게하려면 참조되는 경우 내 변수가 데이터 세그먼트에 저장된다는 의미입니까? 그리고 그것이 참조되지 않으면 스택에 저장됩니까? – password636

+0

필자는 Perl의 모든 변수가 자동 스택이 아닌 관리 된 힙 영역에 할당된다고 생각합니다. 서브 루틴이 종료되면 모든 로컬 변수에 대한 참조 카운트가 감소하고, 다른 참조를 작성하지 않으면 일반적으로 0이됩니다. 이것은 Java에서 객체를 사용하는 것과 같습니다 (스택에 할당 될 수 있고 C 예에서와 비슷합니다). – Thilo