• ベストアンサー

サブルーチンからサブルーチンを呼び出す

#平均を求める,サブルーチンを使用 @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に代入したいのですが,この場合だとうまく代入されていないようなのですが,何がよろしくないのでしょうか?

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> for($i=0;$i<$n;$i++){ ここの$nに値が代入されていないのでループしていません。 for($i=0;$i<=$#dat;$i++) などに修正しましょう。 うまくいっていない原因と直接関係はないですが。 > &mean(@dat); > &sum(@dat); で引数に@datを入れていますが、 サブルーチンmeanやsubでは引数を使っていないので無意味です。 (サブルーチン内で直接@datを参照しているので &mean(@dat2) などと引数をかえても結果が同じ。)

backs
質問者

お礼

早速の回答ありがとうございました。 なるほど,$i<$nの部分がまずかったのですね(確かにこれでは$nに何も代入されていない、、、)。 実は自分でも何か無駄になっているような気はしていたのですが,引数に@datをいれても意味がなかったのですね。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

sub mean{ return(sum(@_)/@_); } sub sum{ my $sum=0; foreach(@_){ $sum+=$_; } return($sum); } #関数内で使用する変数はmy で宣言するようにしましょう。 #関数の引数を利用しましょう

backs
質問者

お礼

早速の回答ありがとうございました。 No.1の方にもご指導いただきましたが,関数の引数を使うべきでしたね。関数内ではmyを使った方が速度が速くなるそうなので,これからは気を配りながらやっていこうと思います。

関連するQ&A