私は以下のようにPerlとCで2つのコードセクションを持っています。これはPerlのmy
変数とCの自動変数に関するものです。ある程度は、関数に入るたびに初期化されるという点ではかなり似ています。しかし、Perlはサブルーチンの変数my
を参照することができます。戻り値の後に関数呼び出しスタックが破棄されるため、Perlはサブルーチンの変数を参照できます。誰でもこの機能をPerlがどのように実装しているのか知っていますか?それは、すべてのサブルーチンコールスタックをそのままにすることはできませんでした。つまり、Perlは "データセグメント"(スタックと比較して)のサブルーチンに作成された変数my
を割り当てますか?Perlはどのようにサブルーチンのプライベート変数へのグローバル参照を実装していますか?
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;
}
おかげで、あなたが関数内でローカルに作成されたいくつかのデータへ参照にグローバル変数を設定している
こんにちは@Thiloサブルーチンの変数に参照カウントを使用できるようにするには、参照されている場合は、my変数がデータセグメントに格納されますか?参照されていなければスタックに格納されますか? – password636
Perlのすべての変数は、自動スタックではなく、管理されたヒープ領域に割り当てられていると思います。サブルーチンが終了すると、すべてのローカル変数の参照カウントが減少し、別の参照を作成しない限り、通常は0になります。これは、Javaでオブジェクトを使用するようなものです(プリミティブとは異なり、スタックに割り当てられ、Cの例のようになります)。 – Thilo