• ベストアンサー

リファレンスをサブルーチンの戻り値にしてもOKですか?

■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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 の「ガベージコレクション」のあたりを参照してください。

gle_gle
質問者

お礼

問題ないということがよく分かりました。ありがとうございました。

その他の回答 (1)

  • s_saike
  • ベストアンサー率46% (36/77)
回答No.1

perlの場合、変数をサブルーチン内でのみ有効にするには、local()を使用する必要があります。それ以外は全てグローバル変数となります。

gle_gle
質問者

お礼

参考になりました。ありがとうございました。

関連するQ&A

専門家に質問してみよう