- ベストアンサー
繰り返し処理について
- カレンダーのCGIを作成した際、繰り返し処理で重くなってしまった構文を効率的に短くする方法を知りたいです。
- 具体的には、$day1から$day31までの処理を繰り返す構文をシンプルにする方法について教えてください。
- また、シンプルにした状態の構文の例も教えていただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
たしかに何がやりたのか曖昧だが、予想して書くとこんな感じ? 表示がくずれるので全角空白を空白2文字にしていることに注意。 use strict; use warnings; my ( $day1, $day2, $day3 ) = qw(100 200 300); { no strict qw(refs vars); no warnings; for my $count ( 1 .. 3 ) { my $day_var = eval '$day' . $count; my $array_name = 'pl' . chr( ord('a') + $count - 1 ); @{$array_name} = cal($day_var); } print $_, q{, } for @pla; # 100A, 100B, 100C, print $/; } sub cal { return ( $_[0] . 'A', $_[0] . 'B', $_[0] . 'C' ); }
その他の回答 (3)
- ryu_chan
- ベストアンサー率37% (69/186)
おそらく、No.3の_--_1l1_1_さんの回答が質問者さんが欲しい回答ではないかと思われます。 内容が少し高度?で、使い方がわからないのでは?と推測します。 かいつまんで書くと、No.3さんの回答は以下です(結果格納場所は配列にしてますが)。 my @pl; for my $count (1..31) { # 1~100ならここを1..100にする no strict 'refs'; my $day = eval '$day'.$count; push @pl, jd::Cal($day + 0.5); # ここが、$pl[0] = &jd'Cal($day1 + 0.5)に相当 } @plに欲しい情報が入っています(この場合、$pl[0]~$pl[30]に入ってます)。 jd::Cal(=&jd'Cal)の引数は、$day1 + 0.5というのを想定しています。
お礼
ご指摘と詳しい解説をありがとうございました。 初心者なもので、C言語か何かと勘違いしておりました。
- pannkoujou
- ベストアンサー率0% (0/2)
抽象すぎる CGIって言っても色々あるしPHPかPerlかRubyか あとどのように考えてそのソースにしたかの説明がないと有力な回答が得られにくいと思うけど
お礼
ご指摘ありがとうございました。 CGIに様々な種類があることを知ることができました。
補足
回答ありがとうございます。 言語はPerlを使用しています。 下の回答者様のところにも補足させていただきました。 $pl[1]=&cal($1); $pl[2]=&cal($2); ・・・・と仮に$pl[100]まで値を求めたい場合、この書き方でいけば100行になってしまいますが、これをforeachなどを使えれば2~3行で済むのではないか?と考え、質問させていただきました。 ちなみにカレンダーに使うものですので、$1などにはユリウス日の数値が代入されており、$pl[1]などは60干支であったり、曜日であったりします。 どうぞ、よろしくおねがいします。
そのプログラムは知りませんが、どの言語にも繰り返し処理の命令はあるはずです。例えばvbとかで言えば、 dim i as integer 変数の宣言です for i=1 to 10 iの値が1から1+1+1・・・でiの値が10になるまで なんらかの処理 next i 基本的にc言語とか一緒です というような for nextなどあると思いますが
お礼
ご回答ありがとうございました。 質問に対して全うな解答がついたとわかりましたので、1度回答を締め切ることにしました。 プログラミング言語には共通点も沢山あるのですね。 さまざまな書き方があるのだという事も知ることができましたし、勉強になりました。
補足
回答ありがとうございます。 プログラミングに関する知識がほとんどないため、説明不足でした。 言語はperlで、おそらくforeachを使うのだろうなと思うのですが、foreach(1,2,3){という123の部分の入力がいまいち理解できず、困っており、それで簡単な例をインターネット上でも探してみたのですが、いまだ理解できずという状況です。 やりたい事としては、最初の@plaなどは$pl[1]という書き方でも$pl1でもいいのですが、これが連番ですし、&jd'cal($day1 + 0.5)の部分も、&cal($1)でもOKです。 $pl[1]=&cal($1); $pl[2]=&cal($2); ・・・・と仮に100まで$plの値を出す場合に、この書き方でいけば100行になってしまいますが、これをforeachなどを使えれば2~3行で済むのではないか?と考え、質問させていただきました。 どうぞ、よろしくおねがいします。
お礼
ご回答ありがとうございました。 no.4の回答者さんのご指摘により、この答えがベストだと知ることができました。 このような複雑な構文になってしまうとは思いませんでしたが、この文を理解し、自分で応用できるよう努力しようと思います。
補足
回答ありがとうございます。 説明不足で申し訳ありません。 PERL言語で書いてます。 printについては最後にまとめておりますので、あくまで@pla ($plという書き方でもかまいません)の値を[1]から複数(仮に[10]まで)求めたい場合の、foreachなどの使い方が知りたくて質問させていただきました。