• 締切済み

Perlで足し算をするには

Perl 初心者です。 いい足し算ができず、困っています。my $Aの数字を足していくだけなのですが、 うまくいきません。 何が悪いのかわかる方教えてください。 よろしくお願いいたします。 Perlではsumをつかわないでしょうか? 下記は4と2と3なので、9になるはずなのですが。。。。 その1 my $A = 4,2,3; $B = (sum($A)); print "$B" その2 my $A = 4,2,3; $B = subsum($A); print "$B"

  • Perl
  • 回答数11
  • ありがとう数0

みんなの回答

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

普通は、my @array = (4, 2 ,3);と書きます。 my $A = "4,2,3";、と書くなら  my @array = split(',', $A); としてからsumできなくもないけれど、 それなら最初から配列変数使えってことになるでしょう。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.10

活発な回答があったので、どなたががフォローするんじゃないかと静観しておりましたが・・・ > $Aにはいろいろな数字が100以上の数字入ります。 perlの変数$Aに100以上だろうが以下だろうが許された範囲の数値なら何入れても勝手ですが $A=4,2,3; みたいに「複数」の「データ」を「一つのデータしか入らない変数」に入れたいと切に願っても言語仕様上、願った結果にはなりません。 お願いするだけでプログラムが動くんだったら世のプログラマの存在ってなんなのかと・・・。 たまたま文法エラーにはならないかもしれませんが「ひとつの箱にはひとつのものしか入らない」のです。 裏技的な手法を使うのではない限り、普通に「複数の入れ物」か「配列変数」を用意するべきではないかと思います。 > ここでは簡単に4+2+3で試していましたが、実際は123 だったり、34だったり、その不特定数値が100以上続きます。 指摘されている問題点は100とか200とか「量」の問題ではなくプログラム言語仕様に対する理解です。 > $A自体の足し算を目標にしております。 一個のデータの足し算という概念が理解できません。 たぶん、$Aのなかに不特定多数のデータが入っているという前提で考えているのでしょうけれど、その前提自体が間違っているのです。 まずは入門書や解説サイトなどを参考にされることをおすすめします。 ポイント部分のURLを張っておきますので参考URLをご参照ください。

参考URL:
http://www.tohoho-web.com/wwwperl1.htm#Scalar
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.9

あ, 気付いたので指摘しとこっと. #6 の最後, print (4+2+3)."\n"; もアウトだ. これは (print (4+2+3))."\n"; と解釈されるので改行の意味がない. もっとかっこを付けて print ((4+2+3)."\n"); としないとダメ.

PerlLearner1
質問者

補足

返事が遅れましたが、つけくわえると目標は、$Aにはいろいろな数字が100以上の数字入ります。ここでは簡単に4+2+3で試していましたが、実際は123 だったり、34だったり、その不特定数値が100以上続きます。なので、$A自体の足し算を目標にしております。どうぞよろしくお願いいたします。

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

うっかりしてました>#7 最近では半分無意識でmy($a,$b)とかやっているので、昔ハマったことをすっかり忘れていました。 ということで、訂正いたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

他の人も書かれているんですが, このような書き方をどこで見たのかが非常に疑問. 以下は余談: my $A = 4,2,3; は (my $A = 4), 2, 3; という解釈になるはずです>#3. my を使うときに my $a, $b; なんていう失敗はよくやらかしますし (この場合 $a にのみ my がかかる), my( ($A=4),2,3) ; と解釈しても 2 や 3 に my を適用する意味がない. あと, 最初の奴は $n に「前回の結果」が残るので sum を複数回呼び出すとアウトです>#6. unpack を使うやつ以外は, (自分ではやらんけど) 意味は分かる.

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.6

たびたびすいません。 回答とはいえませんが面白い参考サイトがあったのでおまけで変態チックな実例をいくつか まぁ、こうも書けると言うperlの醍醐味っていうやつです。 --------------------------------- #!/usr/bin/perl my @A=(4,2,3); my $B = sum(@A); print $B."\n"; exit; sub sum{ $n += $_ for @_; return $n; } --------------------------------- #!/usr/bin/perl my @A=(4,2,3); my $B = sum(@A); print $B."\n"; exit; sub sum{ return eval join "+", @_; } --------------------------------- #!/usr/bin/perl my @A=(4,2,3); my $B = sum(@A); print $B."\n"; exit; sub sum{ return length join "", map 1 x $_, @_; } --------------------------------- #!/usr/bin/perl my @A=(4,2,3); my $B = sum(@A); print $B."\n"; exit; sub sum{ return unpack "%W*", join "", map chr, @_; } --------------------------------- #!/usr/bin/perl my @A=(4,2,3); my $B = sum(@A); print $B."\n"; exit; sub sum{ return unpack("%32d*", pack "d*", @_); } --------------------------------- 1番目以降はなにがなにやら、ほとんど変態的ですね。 でもベストは「ANo.1」さんの示した --------------------------------- #!/usr/bin/perl print (4+2+3)."\n"; exit; --------------------------------- が一番合理的でしょう。

参考URL:
http://kawa.at.webry.info/201106/article_1.html
回答No.5

組み込み関数じゃないですからねぇ もうめんどくさいからエクセルだけやっといたらいいんじゃないですか? 他のプログラミング言語でもやってればその書き方はないんでしょうけどねぇ ma-splitでも使って下さい。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

> うまくいきません。 > 何が悪いのかわかる方教えてください。 perl言語ルールを無視してるあなたが一番悪いのは明白です。 そのリストのままでは新しく別の仕様の言語処理系を作るしか、表示が「9」になることはないでしょう。 ルールにのっとってあなたの示したリストに近いものを書けば --------------------------------- #!/usr/bin/perl my @A=(4,2,3); my $B = sum(@A); print $B."\n"; exit; sub sum{  my $n = 0;  foreach(@_){ $n += $_; }  return $n; } --------------------------------- こんな感じになるんじゃないかな?

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

・$A=4になっている この文は my( ($A=4),2,3) ; と解釈されます。 Perlではよく括弧を省略しています。それを補って考える必要があります。 ・上記の状態を確認せずにリストとして使おうとしている print $Aとか、print $A[0] とかすれば、少なくとも期待通りではないことが確認できるはずです。 ・sum,subsumなんて関数は(標準では)無い ・(出ているはずの)エラーメッセージを確認していない Undefined subroutine &main::sum called at ~ line ~ ってエラーになりませんでしたか? エラーになる、ということは間違えている。 「Undefined subroutine(定義されていないサブルーチン)」だから使おうとしたものが定義されていない=存在しない。 というのがこのエラーメッセージからだけでもわかるはずです。 熟練プログラマーでも、まずはエラーメッセージの確認から始めます。 それを初心者が怠っていればわかるはずがありません。 ・マニュアルを確認していない どんな環境でPerlを使っているかわかりませんが、大抵の場合、perldocという詳細なマニュアルがついています。 perldocコマンドが使えるなら、perldocコマンドで読めます。 Webでも読めます。 http://perldoc.perl.org/ 一部日本語訳もあります。 http://perldoc.jp/ 組込み関数は perldoc perlfunc http://perldoc.perl.org/index-functions.html http://perldoc.jp/index/function で確認できます。 sumやそれに類する関数が無いことがよくわかるはずです。 ・プログラムは「思った通り」に動くものではない 「書いた通り」に動くものです。 Perlは比較的「思った通り」に動く方なのですが、それでも「思い」と「実際の動作」が一致しないことがよくあります。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

> my $A = 4,2,3; この書き方だと $A には4だけが入ります。 試しに print $A してみてください。 初心者なら本なり、Webサイトなりで勉強していると思いますが、 配列の使い方は書いてないのですか? あと、いきなりsumなんて書いてもそんなサブルーチンは存在しないので動作しませんよ。 sumは定義されていませんみたいなエラーでませんでした? サブルーチンsumを自分で作るか、標準モジュールのList::Utilに入っているsumを使うとかしましょう。

関連するQ&A

  • EXCELで足し算できるのにSUMできない

    EXCELシートなのですが、+A+Bなど足し算だとちゃんと計算してくれるのに、+sum(A:B)だと式は正しいはずなのに、答えがゼロになってしまいます。 これはどのあたりを調整すればいいのでしょうか?

  • 「Learning Perl」(第4章、問3)

    Perl初心者です。 「Learning Perl」(オライリー社、第5版)を勉強中なのですが、4章の練習問題3でつまずいています。 #!/usr/bin/perl use strict; sub total { my $sum; foreach (@_) { $sum += $_; } $sum; } sub average { if(@_ == 0) {return} my $count = @_; my $sum = total(@_); $sum/$count; } sub above_average { my $average = average(@_); my @list; foreach my $element (@_) { if($element > $average) { push @list, $element; } } @list; } my $average = average(100, 1..10); print "\$average = $average\n"; my $barney = above_average(100, 1..10); print "\$barney = $barney\n"; とやったのですが、結果が $average = 14.0909090909091 $barney = 1 となってしまいます。 ($averageの値は正しいのですが、$barneyの値が100となってほしいのに、1になってしまっています。) すみませんが、識者の方、どこが悪いのか、ご教授お願いします。

    • ベストアンサー
    • Perl
  • Perl my 改行について

    #Practice Coad in Perl(注意:プログラムは上から実行される) use strict; use warnings; # スカラー変数 my $a = '1'; #これは「1」という数字の入っている箱 my $b = '2'; #これは「2」という数字の入っている箱 my $str = "ABCD_TEXT"; #文字列 print "$a" - "$b" ; print "$str"; 以下のコードで、my$str ="ABCD_TEXT"; #文字列 表示を 3 ABCD_TEXT としたい。 どうすればいいか?

  • perl 初心者です。 わかりやすくお願いします。

    Perlを始めたのですが、本や色いろんなサイトを見てもよく分かりません。 Aと言うデータを読み込んで最大最小・平均・標準偏差を求めたいです。 (1)どこが間違っているのか1部づつでもいいので詳しく教えてください。 (2)一つ一つの意味がちゃんとはつかめていないと感じるので流れを教えてください。 #!/usr/bin/perl # 12345 STDIN use strict; use warnings; open ( FILEHANDLE , " < A " ) ; my @Str=<STDIN>; foreach my $Row (@Str ){ print $Row; } my $Minimum=$ARGV[0]; my $Maximum=$Minimum; my $Sum=$Minimum; my $temp=0; my $i=1; while ( $i < $Num_arg){ $temp=$ARGV[$i]; if ( $Minimum > $temp ) { $Minimum = $temp; }elsif ( $Maximum < $temp ){ $Maximum = $temp; } $Sum = $Sum + $temp; $i++; } my $Average = $Sum / $Num_arg; my $w = foreach my $w(0..$#Numbers){ ($Num_arg - $Average) ** / Num_arg; } my $Standarddivitation = sqrt ($w); print "Average value = $Average \n"; print "Maximum Value = $Maximum \n"; print "Minimum Value = $Minimum \n"; print "Standard devitation = $Standarddevitation;

  • perl

    授業でperlをやっていて課題がでてるのですが、 よく分かりません。 200以上300未満の数字か否かを判断する物を作りたいです。 が、300以上だと反応はないのですが200未満でも反応があります。 どこが違うのか教えてください 2つあります。 (1) my $a= 118; if($a < 200 ){ print "" } elsif($a => 300 ){ print "" } else { print "OK.\n"; } (2) my $x =111; if ($x ge 200 && $x lt 300){ print "OK.\n"; }

  • excelでの足し算

    こんにちは。 excelで、複数シートで大量の足し算を行なっており、シートを開くのに すごく時間が掛かってしまいます。 足し算自体は、単純なものですが、sum関数を使った場合と、+(プラス) 記号を使った場合では、どちらの方が処理が速く終わるのでしょうか? また、 =A1+A2 と =sum(A1:A2) と =A1+A2+A3 と =sum(A1:A3) で処理速度の違いはあるでしょうか? ご存じの方がいらっしゃいましたらご教授ください。

  • perlのdo-while文で抜け出せない 

    perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが   eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら   while(1)にしてlastで抜けるようにすると   code2ではeで抜け出すことができるように   なりましたが、   do~while(1)にしたcode3では、  「Can't "last" outside a loop block at …」C   というエラーが発生します。   code2とcode3はwhileがdo~whileになって   条件を見る位置がループの始めか終わりの   違いだけなのに、なぜ、code2ではOKで、   code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) {  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)

    • ベストアンサー
    • Perl
  • エクセル マクロ 足し算

    いつもお世話になります。マクロ勉強中の初心者です。 マクロの足し算を教えてください。 A列  B列  C列 ・・・・  1   2    3  4   5    6  7   8    9 という数字のデータがあります。 これらのA列の合計、B列の合計・・・など列の合計を出すマクロはわかるのですが、  作成したVBA    Range("a4") = Application.WorksheetFunction.Sum(Range("a1:a3")) A列の合計(A1~A3)とB列の合計(B1~B3)とC列(C1~C3)の合計を、D4に合計させる方法を 教えてください。 どうぞよろしくお願いします。

  • エクセルの足し算

    エクセルで四捨五入の計算式を入れたセルどうしを足し算すると1合わなくなってしまいます。 セルAに620が入っていて、セルBにAの値620×167.66四捨五入をした数字を入れ、その結果のセルBの値を3行足し算すると1合わなくなります。 セルBは103,949になり3行足すと311,848になってしまうのです。 どうしたら良いか教えてください。

  • ACCESS2007 クエリで足し算したいができない。

    クエリで、足し算をしたいのですができません。 例えば、A+B=Cをしたいのですが、クエリ内でAとBが0のデータが空白になってしまっていて、足し算ができません。 AとBに数字が入っている場合は、足されています。 規定値を0に設定すればいいみたいですが、それがわかりません。 規定値を0に設定とはどうやるのですか? 元になっているテーブルに設定するのですか? クエリの方に設定するのですか?

専門家に質問してみよう