2010-11-28 7 views
2

Config :: Tinyを使ってグローバル設定ファイルを読み込むスクリプトがあります。選択変数に基づいて、myスクリプトはSQLite、MySQL、またはPgSQLのいずれかのサブルーチンを選択します。サブルーチン終了時にプライベートバールはどうなりますか?

今のところ、configファイルはスクリプトの一番上に読み込まれ、変数はサブルーチンの外で設定されます。しかし、MySQLのvarsがPgSQLやSQLiteとは何の関係も持っていないことを考慮すると、私はサブルーチンでプライベート変数を設定したかったのです。唯一のものサブルーチンがそのコースを走った後、ヴァースには何が起こるのだろうと思いますか?彼らは削除されますか?

答えて

3

サブルーチンで宣言された変数は、サブルーチンが返された後には存在しません。それらのメモリは解放され、参照された値はガベージコレクションの対象となります(他のものはそれらの値を参照していないものと仮定します)。

+2

字句変数はこのように動作します。パッケージ変数の動作は異なります。 –

+0

パーフェクト!私は、スクリプトが実行されているときに、それがvarsによって使用されたスペースを保持しないことを確認したかっただけです。 – ianc1215

+2

プロセスが終了するまで、メモリはオペレーティングシステムに戻されません。 Perlが関係する限り変数はなくなりますが、perlのメモリサイズには、それが終了するまで割り当てられたメモリが含まれます。 –

5

Perl 5には「private vars」はありませんので、my関数で宣言されている字句変数を意味するものとします。レキシカル変数が宣言されたスコープの最後に、そのメモリチャンクの参照カウントがデクリメントされます。これは、参照カウントがゼロになることを意味する場合、ガベージコレクションを取得します。関数はスコープを提供するので、それらの変数への参照をそれらに保持されているものに渡していないか、またはclosureでそれらを使用している限り、それらはガベージコレクションされるべきです。

+1

いいえ、サブ自体は参照として動作し、レキシカルは解放されません(しかし、サブを出るときに他の参照があれば、サブは新しいレキシカルに割り当てられます)。データ。 – ysth

+0

@ysthあなたが言っていることが私が言っていることとは違うと思うところは分かりません。 –

+1

字句を1Gバイト文字列に設定し、字句が範囲外になると、1Gbはどのような形、形、または形でも解放されません。それはその語彙に付けられたままであり、次にその語彙が範囲に入る時に再利用されます。 – ysth

関連する問題