プロが教えるわが家の防犯対策術!

配列 @in=(10,20,30,40) がある、各項目を $n 倍するプログラムを作っていますが、
$n 倍出来ません。
以下、プログラムです。
#!/usr/bin/perl

@in=(10,20,30,40) ;
print"@inを";
print"何倍しますか?:";
chomp($n=<>);

foreach $ni_tall (@in) {

$n *= $ni_tall;
}
$ave = $n * @in;

print "結果: $ave\n";
print "結果: $ni_tall\n";
print "結果: $n\n";

print "結果: @in\n";

___実行結果___
10,20,30,40を何倍しますか?:7
結果:6720000
結果:
結果: 1680000
結果: 10 20 30 40
となってしまいます。

例えば、
:2
結果:20,40,60,80
としたいのですが、
分かりません。

分かる方いましたら、教えて頂けると助かります。
よろしくお願いします。

A 回答 (4件)

こんな風に書きます。



foreach $i (@in){
$i *= $n
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考にさせて頂きます。

お礼日時:2010/12/28 13:17

こんばんは



10行目

$n *= $ni_tall;



$ni_tall *= $n;

にかえてみましょうか
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
具体的なアドバイスありがとうございます。

お礼日時:2010/12/28 13:15

*= のような複合代入演算子ですが


$a *= $b ;

$a = $a * $b ;
と同等の意味です。
(厳密には、$aが評価される回数が違うので、式によっては違いが出ることはありますが、基本は上の通りです)

そう考えれば
$n *= $ni_tall;

$n = $n * $ni_tall
となるので、どこがおかしいかわかるでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
具体的なアドバイスありがとうございます。

お礼日時:2010/12/28 13:17

> print "@inを";


ダブルクォートでくくると配列の値が展開されるので、
シングルクォートでくくるか、エスケープしましょう。

$ni_tallは、foreachブロック内でのみ有効な変数になります。
foreachブロック終了と同時に、なくなります(printしても何も表示されません)。

> $n *= $ni_tall;
これは、変数$nに数値を代入することになります。
略さず書くと、 $n = $n * $ni_tall;
最終的に、$n = 7*10*20*40の値(1680000)が入ります。

> $ave = $n * @in;
これは、$ave = 1680000 × 4(配列の個数)となります。

Perlは色々な書き方がありますので、以下のようにも書けます。
ご参考までにどうぞ。

my @in = qw(10 20 30 40);
print '@inを何倍しますか?:';
chomp(my $n=<>);

map { $_ *= $n } @in;
print "結果:", join(',', @in);
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考にさせてもらいます。

お礼日時:2010/12/28 13:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!