配列を$n倍するプログラムソース

このQ&Aのポイント
  • 配列 @in=(10,20,30,40) の各項目を $n 倍するプログラムを作成しましたが、正しく動作しません。
  • 実行結果が意図したものと異なり、解決策がわかりません。
  • 質問内容を理解し、適切な解法を提供いただける方からの回答をお待ちしています。
回答を見る
  • ベストアンサー

配列 各項目を$n倍するプログラムソース

配列 @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 としたいのですが、 分かりません。 分かる方いましたら、教えて頂けると助かります。 よろしくお願いします。

  • Perl
  • 回答数4
  • ありがとう数7

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

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.4

> 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);

mai5891
質問者

お礼

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

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

*= のような複合代入演算子ですが $a *= $b ; は $a = $a * $b ; と同等の意味です。 (厳密には、$aが評価される回数が違うので、式によっては違いが出ることはありますが、基本は上の通りです) そう考えれば $n *= $ni_tall; → $n = $n * $ni_tall となるので、どこがおかしいかわかるでしょう。

mai5891
質問者

お礼

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

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

こんばんは 10行目 $n *= $ni_tall; を $ni_tall *= $n; にかえてみましょうか

mai5891
質問者

お礼

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

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

こんな風に書きます。 foreach $i (@in){ $i *= $n }

mai5891
質問者

お礼

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

関連するQ&A

  • このプログラムなんですが

    #! /usr/bin/perl @data=<>; open (IN,"newtype.txt"); @file = <IN>; close (IN); foreach $address (@file) { ($pn,$ad) = split(/\t/,$address); $pnad{$pn}=$ad; } foreach $jusyo (@data) { chomp $jusyo; print $jusyo; print "\n"; print "$pnad{$jusyo}"; } foreach $line (@file) { @data = split(/t\/, $line); if($data[0] =~ "51105") { print "$data[0]"; print "$data[1]"; } elsif($data[0] =~ "651130") { print "$data[0]"; print "$data[1]"; } } exit; コンパイルするときには ./sample.pl data.txt をシェルにうって実行します。 このプログラムでは、はじめに自分で指定したファイル内に存在する郵便番号(通常は7桁だけなんですが、プログラムを見ていただければわかると思われますが、それ以外に5桁(たとえば12354XX,x12354x,xx12354など))と6桁(134567x,x134567など)がありまして、それを表示させたいんですが、上のプログラムでは、if文以下の5桁と6桁があった場合にそれを同時に表示させるプログラムができていないんです。 ハッシュをもちいてプログラムを作り直したいんですが、教えてください。 今日の夜8時までに出さなくてはいけないので、すぐに回答をいただけたらありがたいです。

  • perl 計算結果をファイルへ出力したい

    perl やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • プログラム名でプログラムが実行できない

    #!/usr/bin/perl # calc --計算式 print ("3 * 3 = "); print (3 * 2 ); print ("\n"); #改行 上記のような簡単なプログラムを作ってみました。 ところが、2段目にある「calc」と入力しても 「can not found」と出て実行してくれません。 保存したファイル名で「perl ファイル名」だときちんと実行してくれます。 どこがおかしいのでしょうか? やってみた事は ・which perl →/usr/bin/perl ・「chmod 775 ファイル名」   です。以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 計算プログラム

    perlで計算を行うプログラムをつくっているのですが、 まず、 #! /usr/bin/perl # calc →電卓のプログラムです。コマンドラインに calc 計算式 と入力してください。 $ARGV[0]=~ s/x/*/g; #xをアスタリスクに変換します。 $x=eval($ARGV[0]); print "$x\n"; というものを書いたのですが、コマンドラインで、 calc 計算式とかいたのですが、 コマンドがみつかりません。 とでます。ちゃんとwhich perl で調べたら/usr/bin/perl とでるのですが、、、 あと、計算式に()が つかえません。 だからcosの計算を cos 0.5 というようにするのですが、 1が返ってきます。何をうっても 1と返ってきます。 このperlは学校にリモートログインで 入って使っています。 Linuxのバージョンは7.2です。 お願いします。

    • ベストアンサー
    • Perl
  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlでサブルーチンへの複数の配列渡し

    perlでサブルーチンに配列を渡しているのですが、 引数としている配列が1個の場合は問題ないのですが、 複数渡すと、第2引数以降が渡りません。 どの様にすれば上手くできますか。 例1 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; &test(@x1); sub test { my (@arg1) = @_; print "sub : @arg1 \n"; } 結果 main : 14 11 5 12 8 15 sub : 14 11 5 12 8 15 例2 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; print "main : @x2 \n"; &test(@x1, @x2); sub test { my (@arg1, @arg2) = @_; print "sub : @arg1 \n"; print "sub : @arg2 \n"; } 結果 main : 14 11 5 12 8 15 main : 12 10 8 9 sub : 14 11 5 12 8 15 12 10 8 9 sub : 引数1に全てが設定されて、引数2に設定されていない。

    • ベストアンサー
    • Perl
  • サーバを移行したのですが、プログラムが動きません。

    はじめまして。 Perl超初心者です。 先日、あるサイトのリニューアルをし、PHPでシステムを組んだのですが、一部のコンテンツに関しては、前の業者がPerlで組んでいたシステムをそのまま転用することになりました。 そこで、以前のデータを貰って、サーバのcgi-binのフォルダにそれらのデータをコピーし、関係すると思われるファイルのパーミッションを、755にし、 また、以前は、ファイルの一行目が、#!usr/local/bin/perl だったのですが、 これを、#!usr/bin/perl に修正しましたが、動いてくれません。 Internal Server Error と出てしまいます。 試しに、単純な text.cgi #!/usr/bin/perl print "Content-Type: text/html\n\n"; print "OK"; というファイルを置いてみたのですが、これは動いています。 ちなみに、移行しなければならないcgiファイルは、プログラムの中で、.pl ファイルを複数読み込んでいるのですが、このファイルのパーミッションは、755で良いのでしょうか? また、このプログラムでは、 cgi-bin のディレクトリから、 data というディレクトリの中にある.datファイルを読み込むはずなのですが、このdataというディレクトリは、cgi-binと同階層に置けばよいでしょうか? Internal Server Errorというエラーは、どういうときに出るエラーなのでしょうか? 色々ファイルを操作しても、このエラーしか出ないので、どう対処してよいかよく分かりません。 不勉強で大変心苦しいのですが、 ご回答よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • PerlでHTTPヘッダの\nを外すとエラー

    【PerlでHTTPヘッダの最後の\nを1つでも外すとエラーになります】 初歩的なことですみません。 HTTPヘッダーの最後の\n\nなんですが、ヘッダーの文字列の後に改行が2つ?? と思って この\nを外して、 print "content-type:text/html;charset=utf-8"; とすると、「500 Internal Server Error」 print "content-type:text/html;charset=utf-8\n"; と\nが1つでも 「500 Internal Server Error」 となります。 「\n\n」と2つあればエラーにはならないんですが、なぜ必ず2つ必要なのでしょうか?これは改行が2つって意味ですかね? print "<html>\n"などの\nはソース上やコンソール出力結果上での改行なのはわかります。 この\nは改行したくなければ書かなくてもエラーになりませんよね。(当たり前ですが・・ #!/usr/bin/perl print "content-type:text/html;charset=utf-8\n\n"; ←HTTPヘッダーの\n\n print "<html>\n"; print "<body>\n"; print "<p>テキスト</p>\n"; print "</body>\n"; print "</html>\n";

    • ベストアンサー
    • Perl
  • 初歩的なCGIですが

    #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>perlテスト</TITLE></HEAD>\n"; print "<BODY>\n"; print "本文1<BR>\n"; print "本文2<BR>\n"; print "</BODY>\n"; print "</HTML>\n"; 上記プログラムをFTPサーバにアップロードして、perlプログラム内では正しい結果が出たのですが、ブラウザ上で確認したら、htmlのタグが除かれた状態のソースが出てきました。  正しい結果をブラウザ上で表示させるにはどうすればいいのでしょうか?教えてください。

    • ベストアンサー
    • CGI
  • CGI勉強中(初心者です)

    #!/usr/bin/perl print "content-type:text/html\n\n"; print "<HTML>\n"; print "<head><title>CGI</title></head>\n"; print "<BODY>\n"; print "<H1><FONT COLOR=\"#FF0000\">こんにちは</FONT></H1>\n"; print "</BODY>\n"; print "</HTML>\n"; というCGIつくりました。 プロバイダの説明には Perlの場所 /usr/bin/perl または /usr/local/bin/perl となっていますが、 どこにどう置いて(ホームディレクトリでしょうか?)、どうやって起動させてよいのかさっぱりわかりません。 ご教授ください。

    • ベストアンサー
    • CGI