- ベストアンサー
サブルーチンからサブルーチンを呼び出す
#平均を求める,サブルーチンを使用 @dat=(1,2,3,4,5,6,7,8,9,10); $mean=&mean(@dat); print "mean="; print $mean; sub mean{ $sum=&sum(@dat); $n=@dat; $mean=$sum/$n; return($mean); } sub sum{ for($i=0;$i<$n;$i++){ $sum+=$dat[$i]; } return($sum); } Perlを勉強し始めたのですがサブルーチンの所で分からない所があるので教えていただけませんか? mean関数(Perlではmeanルーチンなどと呼ぶべきでしょうか?)の中でsum関数を呼び出してデータの合計を$sumに代入したいのですが,この場合だとうまく代入されていないようなのですが,何がよろしくないのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> for($i=0;$i<$n;$i++){ ここの$nに値が代入されていないのでループしていません。 for($i=0;$i<=$#dat;$i++) などに修正しましょう。 うまくいっていない原因と直接関係はないですが。 > &mean(@dat); > &sum(@dat); で引数に@datを入れていますが、 サブルーチンmeanやsubでは引数を使っていないので無意味です。 (サブルーチン内で直接@datを参照しているので &mean(@dat2) などと引数をかえても結果が同じ。)
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
sub mean{ return(sum(@_)/@_); } sub sum{ my $sum=0; foreach(@_){ $sum+=$_; } return($sum); } #関数内で使用する変数はmy で宣言するようにしましょう。 #関数の引数を利用しましょう
お礼
早速の回答ありがとうございました。 No.1の方にもご指導いただきましたが,関数の引数を使うべきでしたね。関数内ではmyを使った方が速度が速くなるそうなので,これからは気を配りながらやっていこうと思います。
お礼
早速の回答ありがとうございました。 なるほど,$i<$nの部分がまずかったのですね(確かにこれでは$nに何も代入されていない、、、)。 実は自分でも何か無駄になっているような気はしていたのですが,引数に@datをいれても意味がなかったのですね。