2009-07-07 21 views
2

$ refで参照される無名配列がどのスコープまで利用できるかは、次のコードで確認できます。perlの変数の範囲

 
mod1.pm: 
package mod1; 
sub do_something{ 
..... 
my $array_ref = ["elemnt1","elmnt2"] ; 
return $array_ref ; 
} 
1; 

file.pl 
use mod1; 
my $ref = mod1::do_something() ; 
print "$ref->[0] $ref->[1] " ; #works 
+0

これは正常ですか?あなたは 'return 1;'をfile1.plの最後に 'do_something'をエクスポートまたはインポートしないでください。mod1はfile1.plというファイルに入っていますから、どのように正確にそれを見つけるのですか? モジュールの簡単なチュートリアルはこちらをご覧ください:http://perl.plover.com/Hello/ – Telemachus

+0

私は編集しました。:) – sud03r

+0

正しい答えをアップして受け入れるべきです。 –

答えて

15

。データ["elemnt1"、 "elmnt2"]は、do_somethingの終了時に範囲外になる変数($ array_ref)に割り当てられます。しかし、それが返されるので、データへの参照があり、$ array_refが範囲外になった場合でもデータは保持されます。

前回私が調べたところでは、ガベージコレクションの参照カウントを使用していました。そのため、最後の参照が範囲外になるまで、配列はガベージコレクションされません。例。

2

誰でも参照できる限り利用可能です。

6

私が正しく質問を理解していた場合は$ refの範囲は、あなたが無名配列を作成しているdo_somethingでfile2.pl

のすべてで、それはヒープ上に座っていると、いずれかの一部ではありません範囲。したがって、参照は渡すことができ、それを指す参照がなくなるまでどこでも使用できます。

+0

ええ、 'my'変数への参照(' do_something'が '\ $ ref_array'を返した場合)さえスコープから切り離されます。 PerlはCではなく、以下のキューブが言っているように、 "誰でも参考にしている限り"利用可能です。 – Massa

+0

マイナーな修正: '$ ref'のスコープは、file2.plのすべてではありません。これは、ファイルの最後まで宣言されているポイントから見ることができます。 –

0

その範囲は、それが返され、$ refの中に保存されているまで、それが作成されますdo_somethingサブルーチンに限定されています。 file2.plの$ refに格納されると、それはfile2.plのどこにでもあります。あなたは変数のスコープ、および参照によって指されるデータの持続性の違いで苦労しているように聞こえる質問から

8

アレックスファインマンは正しいアイデアを持っています。変数名には有効範囲があり、データには適用されません。無名配列のスコープを要求することは、文字列のスコープを要求するようなものです。文字列には、直接的または間接的(すなわち、参照)のアクセスを提供する変数がある限り、アクセス可能です。

+1

これは '2'の範囲を求めるようなものです –