こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2006-08-10 23:35:10

QNo.2332504

すぐに回答ほしいです

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

> for($i=0;$i<$n;$i++){
ここの$nに値が代入されていないのでループしていません。

for($i=0;$i<=$#dat;$i++)
などに修正しましょう。



うまくいっていない原因と直接関係はないですが。
> &mean(@dat);
> &sum(@dat);
で引数に@datを入れていますが、
サブルーチンmeanやsubでは引数を使っていないので無意味です。
(サブルーチン内で直接@datを参照しているので &mean(@dat2) などと引数をかえても結果が同じ。)

投稿日時 - 2006-08-10 23:52:34

お礼

早速の回答ありがとうございました。

なるほど,$i<$nの部分がまずかったのですね(確かにこれでは$nに何も代入されていない、、、)。

実は自分でも何か無駄になっているような気はしていたのですが,引数に@datをいれても意味がなかったのですね。

投稿日時 - 2006-08-11 08:28:58

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

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

投稿日時 - 2006-08-11 03:49:44

お礼

早速の回答ありがとうございました。

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

投稿日時 - 2006-08-11 08:32:39

あなたにオススメの質問