- 締切済み
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"
- みんなの回答 (11)
- 専門家の回答
みんなの回答
- kuroizell
- ベストアンサー率55% (95/170)
普通は、my @array = (4, 2 ,3);と書きます。 my $A = "4,2,3";、と書くなら my @array = split(',', $A); としてからsumできなくもないけれど、 それなら最初から配列変数使えってことになるでしょう。
- ralf124c
- ベストアンサー率52% (232/446)
活発な回答があったので、どなたががフォローするんじゃないかと静観しておりましたが・・・ > $Aにはいろいろな数字が100以上の数字入ります。 perlの変数$Aに100以上だろうが以下だろうが許された範囲の数値なら何入れても勝手ですが $A=4,2,3; みたいに「複数」の「データ」を「一つのデータしか入らない変数」に入れたいと切に願っても言語仕様上、願った結果にはなりません。 お願いするだけでプログラムが動くんだったら世のプログラマの存在ってなんなのかと・・・。 たまたま文法エラーにはならないかもしれませんが「ひとつの箱にはひとつのものしか入らない」のです。 裏技的な手法を使うのではない限り、普通に「複数の入れ物」か「配列変数」を用意するべきではないかと思います。 > ここでは簡単に4+2+3で試していましたが、実際は123 だったり、34だったり、その不特定数値が100以上続きます。 指摘されている問題点は100とか200とか「量」の問題ではなくプログラム言語仕様に対する理解です。 > $A自体の足し算を目標にしております。 一個のデータの足し算という概念が理解できません。 たぶん、$Aのなかに不特定多数のデータが入っているという前提で考えているのでしょうけれど、その前提自体が間違っているのです。 まずは入門書や解説サイトなどを参考にされることをおすすめします。 ポイント部分のURLを張っておきますので参考URLをご参照ください。
- Tacosan
- ベストアンサー率23% (3656/15482)
あ, 気付いたので指摘しとこっと. #6 の最後, print (4+2+3)."\n"; もアウトだ. これは (print (4+2+3))."\n"; と解釈されるので改行の意味がない. もっとかっこを付けて print ((4+2+3)."\n"); としないとダメ.
- kmee
- ベストアンサー率55% (1857/3366)
うっかりしてました>#7 最近では半分無意識でmy($a,$b)とかやっているので、昔ハマったことをすっかり忘れていました。 ということで、訂正いたします。
- Tacosan
- ベストアンサー率23% (3656/15482)
他の人も書かれているんですが, このような書き方をどこで見たのかが非常に疑問. 以下は余談: 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)
たびたびすいません。 回答とはいえませんが面白い参考サイトがあったのでおまけで変態チックな実例をいくつか まぁ、こうも書けると言う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; --------------------------------- が一番合理的でしょう。
- 4gb_sdcard
- ベストアンサー率0% (0/0)
組み込み関数じゃないですからねぇ もうめんどくさいからエクセルだけやっといたらいいんじゃないですか? 他のプログラミング言語でもやってればその書き方はないんでしょうけどねぇ ma-splitでも使って下さい。
- ralf124c
- ベストアンサー率52% (232/446)
> うまくいきません。 > 何が悪いのかわかる方教えてください。 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)
・$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)
> my $A = 4,2,3; この書き方だと $A には4だけが入ります。 試しに print $A してみてください。 初心者なら本なり、Webサイトなりで勉強していると思いますが、 配列の使い方は書いてないのですか? あと、いきなりsumなんて書いてもそんなサブルーチンは存在しないので動作しませんよ。 sumは定義されていませんみたいなエラーでませんでした? サブルーチンsumを自分で作るか、標準モジュールのList::Utilに入っているsumを使うとかしましょう。
- 1
- 2
補足
返事が遅れましたが、つけくわえると目標は、$Aにはいろいろな数字が100以上の数字入ります。ここでは簡単に4+2+3で試していましたが、実際は123 だったり、34だったり、その不特定数値が100以上続きます。なので、$A自体の足し算を目標にしております。どうぞよろしくお願いいたします。