• ベストアンサー

CGIからメールに書き出しする際に行揃えをしたい

フォームからの書き込みをメールで受け取る際に、 お名前 ○○ ○子 ご住所 東京都○○… お電話番号 01-2345-6789 メッセージ ×××××… となるのを以下のように行が揃うようにしたいです。 お名前    ○○ ○子 ご住所    東京都○○… お電話番号 01-2345-6789 メッセージ  ×××××… 項目欄であるname="xxx"の文字数字バラバラなので、 その後に続くvalue="yyy"の頭がうまく揃いません。 テーブルは使いたくないのですが、 何か他に方法はありますか? \tを入れてみたりしたのだけど、ダメでした。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.2

valueを配置する位置を決めて、keyの不足部分に半角スペースを補うとか。 $value_point = 20; foreach $key ( keys( %in ) ) { while ( length( $key ) <= $value_point ) { $key = "$key "; } } こんな感じなんでしょうけど、なんだかスマートじゃないですねぇ。 # $value_point はバイト数です。

cloud9
質問者

お礼

再びありがとうございます。 この方法、私も考えてやってみたのです。 でも、私の方法ではダメでした…(がっかり) こういう風にやるんですね。 今この方法でやりかけなので、 明日、アドバイスを参考にもう一度やってみようと思います。

その他の回答 (4)

  • jubay
  • ベストアンサー率30% (3/10)
回答No.5

#3の続きです。 ハッシュを使ってやる場合、 %in = ("name" => "Momo","address" => "Osaka", "tel" => "06-****-****","message" => "TEST"); format FILE = @<<<<<<<<<<@<<<<<<<<<<< $key $val . open (FILE,">test.txt") or die; while (($key,$val) = each %in){ write FILE; } close FILE; でもいいですし、 項目の順番を気にするなら、 ハッシュを配列に代入してから、 @all = ("name,$in{'name'}","address,$in{'address'}", "tel,$in{'tel'}","message,$in{'message'}"); format FILE = @<<<<<<<<<<@<<<<<<<<<<< $key $val . open (FILE,">test.txt") or die; foreach (@all){ ($key,$val) = split (/,/); write FILE if($val); } close FILE; とやるのもいいと思います。

cloud9
質問者

お礼

ありがとうございます。 フォーマットとかハッシュとか全く分からず、 回答者さんにお答えいただいた内容も理解できずにいたので、 今日、いろんなサイトを見て回りました。 自分がいじっているスクリプトと回答頂いた分と、 説明が書いてあるサイトを見比べながら、少しずついじっています。 元にあるスクリプトがちょっぴり複雑で、 書いて頂いたスクリプトをどこにどう入れ込めばいいのか 分からなかったのです。 まだいじっている最中で、出来上がってはいないのだけど、 何とかなりそうな予感がします。 こんなに頭を使ったのは久しぶりで、くたくたです(笑) 本当にどうもありがとうございました。

cloud9
質問者

補足

ポイントは回答者順にさせてくださいね。 分からないことがあった時はまたよろしくお願いいたします。

  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.4

すみません、No.3さんにです。 あー、懐かしいというか、そういうのありましたね。 すっかり忘れていました。 う~む、素晴らしい・・・

cloud9
質問者

お礼

あ、「う~む、素晴らしい…」ってことは、 #3さんの方法で私の問題が解決するってことですね。 しかも素晴らしいってことだから、良い方法なのですね。 下のお礼で、また恥ずかしいことを書いてしまいました。 明日、続きをやってみて、結果をまた報告いたしますね。 私に出来るかな?? 気にかけてくださってありがとうございます。

  • jubay
  • ベストアンサー率30% (3/10)
回答No.3

perlならフォーマットを使ったらどうでしょうか。 @all = ("name,Musashi","address,Tokyo", "tel,03-****-****","message,Hellow!"); format FILE = @<<<<<<<<<<@<<<<<<<<<<< $name $value . open (FILE,">test.txt") or die; foreach (@all){ ($name,$value) = split (/,/); write FILE; } close FILE; 項目の間隔は <<<<< で調節します。 注)ドット(.)はフォーマットの終りを示します。

cloud9
質問者

お礼

<<<<<< ↑こういうのが続くCGIのプログラムって初めて見ました。 フォーマットというのですね。 上のプログラムだと、MusashiとかTokyoとか、 valueの部分がすでに決まっている場合ですよね? 私が取り組んでいるのは、訪問者に書いてもらうフォームで、 名前とか住所とかは、訪問者さんのプロフィールごとに 違ってくるんです。 それでもこの方法でできますか? まだまだ分からないこと知らないことがたくさんあって、 もっと勉強しなきゃダメですね。 今後の参考にしたいと思います。 ありがとうございました。

  • ikspiari
  • ベストアンサー率48% (29/60)
回答No.1

項目名の後に必要な分だけ半角スペースを入れればそれでいいと思うのですが、どうでしょう? HTML メールじゃなければテーブルは使えない(というかソースがそのまま表示される。)と思います。

cloud9
質問者

補足

ありがとうございます。 補足になりますが、 項目がいくつかあって、 name = &key value = &value として書き込みのあった所だけをずら~っと 書き出すようになっているのです。 下手な説明だけど分かりますでしょうか? メールの本文を書くforeachのその部分を 書き換えればどうにかなるのでは… と思っているのですが、間違ってます? かなり大幅に書き換えなければならない、というのであれば、 もう私の手には負えないのですが… テーブルの件は全くその通りですね。 恥ずかしいです。

関連するQ&A