Perl如何实现对子例程的私有变量的全局引用?

时间:2016-07-25 10:12:38

标签: perl reference return subroutine

我有两个代码部分,如下所示,在Perl和C中。这是关于Perl的my变量和C的自动变量。在某种程度上,它们非常相似,因为它们在每次进入函数时都会被初始化。但Perl可以引用子例程的my个变量,如果这样做,C将得到随机值,因为函数调用栈在返回后被销毁。任何人都知道Perl如何实现此功能?它不能保持每个子程序调用堆栈不变,是否Perl分配在“数据段”中的子程序中创建的每个my变量(与堆栈相比)?

Perl代码:

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;
}

谢谢,

1 个答案:

答案 0 :(得分:0)

您正在将全局变量设置为引用,以便在函数中本地创建一些数据。

在Perl(一种“托管内存”语言)中,这将是一个引用计数“对象”(使用松散的术语,因为它是一个字符串),在所有引用都消失之前不会被垃圾收集。

在C中,这只是一个内存地址,你必须确保它仍然有效(并且不会指向函数返回时已经回收的堆栈空间。)