• 締切済み

foreach 文での行指定方法

はじめましてこんばんはm(_ _)m いろいろ検索してみましたが解決出来ませんでしたので何卒ご教授願います。 あるフリーのcgiを利用させてもらっているのですが一部改造したいと思っております。 cgiはフォームメール用で以下のプログラムによってhtml側のデータを読み取ってくれます。この時にhtml側のデータを全て読み取ってくれるのですが一部のみを抜粋して上から順に表示させたいと思います。 例えばhtml側が以下の3項目でこの順番だとして()内はNAMEです。 【html側】 質問=NAME属性(A) 名前=NAME属性(B) 電話=NAME属性(C) これをメールで受け取った時に以下のメール文のようにNAME属性(B)が先頭に来るようにしたいのです。 【メール文】 (B)= 山田太郎 (C)=0123456789 (A)=好きな食べ物はイチゴ (B)の行が上から何番目という様に指定する方法では出来るのですが複数ファイルがあり(B)の行番号が変動する為指定出来ません。 【html側】が以下のようになっているとして以下のプログラムはどのように指定すればよろしいですか?当方初心者の為質問内容が分かりにくいかと存じますが何卒よろしくお願いいたします。 質問=NAME属性(A) 名前=NAME属性(B) 電話=NAME属性(C) foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } }

みんなの回答

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

HTML側の並び順で入力データが送られて来ることを期待して、ということであれば、 foreach (0..$count-1) { の前に、 push(@DATA_N,shift @DATA_N); push(@DATA_V,shift @DATA_V); を挿入すればよろしいかと思います。

kohkun2008
質問者

お礼

okmotokun 様 度々のご指導ありがとうございます。プログラム追加してみましたところ1行目が最終行になりました!他にもいろいろいじってみたところ値のみが1行ずれたり項目のみがずれたり反対になったりといろいろ便利なプログラムなようです。教えていただき感謝いたします。 後、厚かましいようで大変申し訳ございませんがHTML側のソースが以下のように質問1~質問100くらいあり(この質問数は101個になったりいろいろ変動します)その後に名前や住所が来るのですがこの状況(住所の後も項目数が変動します)で【名前項目を最上部に持ってきて】その他の項目は表示順にさせたいのですが可能でしょうか?cgiプログラム1つを修正無しで使いまわして多数のHTMLページに対応させたいです。 何卒ご指導宜しくお願いします。 【HTMLソース】 <HTML> <BODY> <FORM method="POST" action="mailform.cgi"> 質問1<INPUT SIZE="50" TYPE="text" NAME="q1"> ~中略~ 質問100<INPUT SIZE="50" TYPE="text" NAME="q100"> メールアドレス:<INPUT SIZE="50" TYPE="text" NAME="email"> 名前<INPUT size="58" type="text" name="Name"> 住所1<INPUT SIZE="50" TYPE="text" NAME="add1"> 住所2<INPUT SIZE="50" TYPE="text" NAME="add2"> </FORM> </BODY> </HTML>

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.1

フォームに入力されたデータは、HTMLでの並び順(行番号順)に送られて来るとは限りません。 したがって、HTMLでの行番号順にメール本文を整形しても意図したようになるとはいえません。 データは、「識別名=入力値」という形で、これを「&」記号で繋げて送られてきます。 この場合ですと、A=質問&B=名前&C=電話 というふうに送られて来るわけです。順番は変わるかも知れません。 ですから通常は、フォーム要素の識別名(NAME)と同じ変数名に入力値を代入して後の処理するようにしています。 あるフリーのcgiを利用しているとのことですが、お使いのスクリプトはそのようになっていませんか。

kohkun2008
質問者

お礼

okmotokun 様 早速のご指導ありがとうございます。すごく参考になります。 フリーのcgiは &jis("--- ここから ---"); print OUT "$msg\n\n"; $count = @DATA_N; foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } } &jis("--- ここまで ---"); print OUT "\n$msg\n"; となっております。これで一応HTML側の並び順でメールが送られて来ます。この場合どの様に記述を変更すればB=名前が一番上にきてそれ以外がHTML順に並びますか? 度々申し訳ございませんがご指導宜しくお願いしますm(_ _)m

関連するQ&A

専門家に質問してみよう