- ベストアンサー
perl セレクトメニューの表示方法についての質問
- 質問者はperlでセレクトメニューを作成しているが、日付の範囲を増やすと表示が長くなってしまい、foreachを試してもうまくいかないという問題がある。
- 質問者はエスケープやダブルクォーテーションを試してみたが、選択肢に月日が表示されない。基本的に間違っているのかどうか教えてほしい。
- 質問者は他にも間違った部分があれば教えてほしいとも述べている。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
forで日付の配列を作る処理は問題ないので、表示されないとすると、if文の条件が該当しないから表示されていないだけでしょう。 まずは、ifをなくしてすべて表示させてみてください。 それから、全体の流れから推測すると、このifは、選択済みのoptionタグか、そうでないoptionタグのどちらかを表示する分岐ではなかったのでしょうか?
その他の回答 (2)
- atom_seed
- ベストアンサー率48% (25/52)
入れ替えるように回答を書いたつもりですし、実際そのように記入できているようですが、うまくいきませんか? 最初の質問のときには、 > @pl = ('$day1', '$day2', '$day3'); で、変数を展開すべきところをシングルクォートでくくってしまって、変数のまま出ていたと思いますが、 私の回答ではその方法をまるごと差し替えたので解決したはずなのですが。 何がしたくて、今どうなってるのか、ご自身でしか分からない部分はなるべく説明するようにしてもらえると回答しやすいです。
補足
はい、うまくいかないのです。 年月日のプルダウンがありましたので $day1 $day2 $day3 をselect optionでの表示はできていました。 これの日間隔の変更を簡単にする為とソースを簡単にする為に記述した foreachができませんでした。 $の展開が出来ない為だと思います。 そのまま$表示されたり、optionが空白で長くになったり"'$day1'""とかw 次に教えて頂いたfor(書いた場所が正しいのかもわからないのですが) optionでは ↓ なし 例1 と初期optionの3項目しか表示しなくて、その下は空白・空欄もありません。 メイン.cgiでは前に作った#$day2 = day0($time + (86400 * 3));の $time とか $day2 とかを試しに表示させると(option以外の場所に) 1214922371 2008/ 7/ 3(木)とか正常に表示されますが forで作った $day2 $day3 $day4....とかが普通に(option以外の場所にも) 表示されないのもforが作用していないの?と思います。 また、2..14 を 2..5 とかやっても表示されません。 foreachとかforとか初めてでそのへんはさわれないので 数字や名前等を書き換えたりしたのですが、何も変化ありません。 質問部分のif ($in{'plan'} eq $_) { は、pl に訂正してまして前の補足のが正しいです。
- atom_seed
- ベストアンサー率48% (25/52)
# 範囲日 $day1 = day0($time + (86400 * 2)); $day2 = day0($time + (86400 * 3)); $day3 = day0($time + (86400 * 4)); ############ 上下の行のday数が14日間位まで続く・・・ @pl = ('$day1', '$day2', '$day3'); シングルクォートは変数を展開しないので使い方が間違っています。 また、forを使えば短く書けます。 時間は計算済みの数字ではなく式を書いておくと、あとで読み直しやすいです。(&day0のなかでやっている方法をおすすめします) for my $i ( 2 .. 14 ) { push( @pl, day0( $time + ( 60 * 60 * 24 * $i ) ) ); } > 基本的に間違っているのでしょうか・・・ お願いします。 > *他にも変なところがあったら教えて下さい。 最初のif文で分岐した内容が同じものprintしていますので要注意です。
補足
笑わないでくださいね(T_T) forをどこに書けば良いのでしょうか?。 <select name=day><option value="なし" selected> ↓ <option value="なし">なし<option value="例1">例1 EOM foreach (0 .. $#pl) { if ($in{'pl'} eq $_) { print "<option value=\"$_\">$pl[$_]\n"; } } print "</option></select>\n"; #-------------------------------------- ### ↑メイン.cgiです。↑ ### ↓ サブ.cgiです。↓ #-------------------------------------- # 時間 $time = time(); # 範囲日 for my $i ( 2 .. 14 ) { push( @pl, day0( $time + ( 60 * 60 * 24 * $i ) ) ); } # 日計算 sub day0{ my(@weekdayname) = ('日','月','火','水','木','金','土'); my $time = shift || time(); my $day0 = $time + (24 * 60 * 60); my ($yyyy, $mm, $dd, $w) = (localtime($day0))[5,4,3,6]; $yyyy += 1900; $mm += 1; return( sprintf('%4d/%2d/%2d(%s)', $yyyy, $mm, $dd, $weekdayname[$w]) ); }
お礼
表示されました!! 感謝感激 if 部文はその通りです。 最初に指摘された if 文のところです。 foreachは別のCGIをコピペしまして if else のところで片方にselectedがありました。 初期値optionにselectedがある為、素人考えで消しちゃいました┐(´ー`)┌ atom_seedさんに少しでも近づけるようにもっと勉強しますw。 本当にありがとうございました 10000 点の回答です!