- ベストアンサー
リファレンスをサブルーチンの戻り値にしてもOKですか?
■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サブルーチンの中でmy を使って宣言した変数であれば、 そのリファレンスを返しても問題ありません。 というのはそのような変数は、どこから参照されているかという 数を数えていて、それが0になったときに初めて実体が破棄されるからです。 >my @a = (3, 1, 4, 1, 5); ここで配列変数を作ってそれが @a なのでこの時点で参照数は1です。 > return \@a; > } ここで@aのリファレンスを\で取得してそれを返しているので +1 して参照数が2になります。 が、すぐにこのサブルーチンが終わるのでそこで-1されます。 結果として、参照数が1の状態でサブルーチンを抜けるので 実体は破棄されずに残り続けることになります。 Cなんかだと関数にローカルな変数のアドレスや参照を返すのは ご法度ですが、Perlはそうではないということです。 #Cでもstaticであれば返せますけどね。 Perl http://www.prenavi.net/~myoujin/tech/perl.html の「ガベージコレクション」のあたりを参照してください。
その他の回答 (1)
- s_saike
- ベストアンサー率46% (36/77)
perlの場合、変数をサブルーチン内でのみ有効にするには、local()を使用する必要があります。それ以外は全てグローバル変数となります。
お礼
参考になりました。ありがとうございました。
お礼
問題ないということがよく分かりました。ありがとうございました。