- ベストアンサー
繰り返し構造内での変数の確保の仕方
内部処理の質問になってしまうのですが、 sub Test{ my($i); for($i = 0; $i < 10; $i++){ my($flag) = 0; #何らかの処理... } } というものがあった場合、 for文中の$flagは繰り返しのたびにmy&変数開放を行ってしまうのでしょうか? sub Test{ my($i, $flag); for($i = 0; $i < 10; $i++){ $flag = 0; #何らかの処理... } } の方が良いのでしょうか? すごく疑問に思い、動作の軽そうな常に後者の方を利用していました。 お答えをよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
変数展開を行ってしまっていると思います。 for内及びfor外でmy宣言をした場合のそれぞれについて、試しに速度を測ってみたところ、かかる時間の比は for外 : for内 = 4.60 : 6.10 という結果が得られました。 (for文のループを10000000回にしてためしました) やはり外で宣言した方が役1.3倍くらい速いようです。 しかしそこまで劇的な差が無いですし、変数名の競合やバグ等の対策を考えればforループ内でしか使わない変数は(perlにおいては)forの中でmy宣言した方がいいのかもしれません。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
テストしてみるために次のようなコードを書いてみました。 for($i=0;$i<10;$i++){ my($flag)=0; if($i == 5 ){ $flag = 5; } print "$flag\n"; } $flagの値が5として出力されるのは、$iが5の時だけなので、毎回(前回のは解放され)新しく確保される(というか上書きされる?、=0を削除すると空白になるので、やはり、新しく初期化されている)考えていいのではないでしょうか my関数がローカル変数を作るために毎回なんらかの手続きを実行するとすると、 この場合、ムダなことをしていると思います。 実際に内部でどうなっているのかは知りませんので 自信はないです。
お礼
確かに、=0を削除しても空白になるということはmyが再実行されているようですね…。 インタプリタのため処理を早くする記述をするか、管理しやすくするか…トレードオフですが、これからも勉強していきたいと思います。 ありがとうございました。
お礼
確かに、外側で変数確保した場合は変数名の管理が難しくなります…。 他の言語でもどのようにして確保されているのかが気になりますので自分でも試してみたいと思います。 お答えありがとうございました。