• ベストアンサー

サブルーチンと繰り返し処理を使いたい

今、フォームメールを作っています。 環境はFC3&perl5になります。 複数のチェックボックスがあって、それぞれのチェックボックスの値は「数百文字」のテキストが入っています。 半角72文字で折り返してメールを投げたいので、 fold.plを用いたいのですが、それをサブルーチン化し、かつ数多くのチェックボックスをサブルーチンで改行処理を加えたものをいれたいです。 流れはなんとなくわかるのですが、 変数がどのように記述すればいいかわかりません。 ご教示ください、よろしくお願い致します。 -------------------- require "fold.pl"; require "cgi-lib.pl"; require "jcode.pl"; $q1 = $in{"q1"}; #変数を格納して $q2 = $in{"q2"}; <略> $q35 = $in{"q35"}; while ( ??? < 36) { #35回繰り返し &fold(???); } #流し込みテキストを改行する------------ sub fold{ while (length(@_)) { (my $folded, @_) = fold(@_, 72); $str_fold .= $folded . "\n"; } return $str_fold; $message = <<END_OF_MESSAGE; #メール送信処理 <ヘッダ群(省略)> $q1 $q2 $q3 ... $q35 END_OF_MESSAGE &jcode'convert(*message,'jis'); #j-code.plでメール用に変換 open(MAIL,"|$sendmail -t"); print MAIL $message; close(MAIL);

  • Perl
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • mekerock
  • ベストアンサー率64% (9/14)
回答No.3

cgi-lib.plを使っているようなので、 #2さんのご指摘のように、同じ名前の方が楽かと思います。 ただ、配列ではなく、\0で区切られたデータになっていると思います。 例) $in{"hoge"} = "string1\0string2\0string3\0...."; なので、splitを使いつつ、foreachなどで、ループさせては如何でしょう?

その他の回答 (2)

回答No.2

checkboxのnameを統一しておけば、 CGIで受け取る際にはリストで受け取れませんか? my @input = $in{checkbox_name}; という感じです。 もしくはsplitで区切る等して処理を。 一度配列にいれてしまえば、 あとは基本的にループで回すだけです。 ループ変数を考えると面倒になるので、 できればforeach等で一括処理してやると楽になります。 いずれにせよ、 まずはcheckbox1つから始めて、2つに増やして… と段階ごとにチャレンジしていくといいと思いますよ。 while (length(@_)) { (my $folded, @_) = fold(@_, 72); このあたりの表記が変に思えます。 おそらくスカラーになるのでは・・ ex. (my $folded, my $leftover) = &fold($line, '72');

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.1

q1からq35をq01からq35に名前を付け直すとよいでしょう。 while ( ??? < 36) { #35回繰り返し &fold(???); } そうすれば上記の部分はいちいち$q1等に代入せずとも foreach (sort keys %in) { &fold($in{$_}); } で済むのでは?

関連するQ&A

  • 非常に見にくいです.....

    このジャンルであっているかどうか微妙ですが質問させていただきます。 よくフリーのCGIやPHPなどのテキストファイルをダウンロードしたとき、アップロード時に転送モードが悪かったのかどうか知りませんが、よく #!/usr/bin/perl↑↑require './jcode.pl';↑require './cgi-lib.pl';↑↑..................... のように改行部がすべて↑になってますよねぇ? もし「戻りページ」など設定しなければならない部分があったりする時は非常に見にくくやりづらいのです。 そこでこの上の例を自動で #!/usr/bin/perl require './jcode.pl'; require './cgi-lib.pl'; に書き換えてくれるようなソフトがあったら教えて下さい!!

    • ベストアンサー
    • CGI
  • Perlでuse strictと %inの共存

    use strictを使うと、変数の使用に厳密にチェックしてくれるので、便利だと思い使いましたが、ReadParse後の%inを利用する場合に宣言されていないエラーが表示されます。意味的には正しいですが、$in{'test'}など CGIで受け取った内容が扱えなくなるので、困っております。何か解決方法は有るのでしょうか? use strict; require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; my $x = $in{'md'};

    • ベストアンサー
    • Perl
  • メールを文字化けしないようにしたい

    次のようにメールを送信しようとしています。 Fedora CoreはUTF-8なので、jcode.plでJISに変換しようとしています。 require "jcode.pl"; $subject = "テストメール"; $data = "これはテストメールです。"; &jcode::convert(\$subject,'jis'); &jcode::convert(\$data,'jis'); @str = "subject:$subject\n\n"); push (@str, "$data\n.\n"); これがなぜかうまくいきません。メーラーの文字コードをutf8にすると正常に表示されます。 使い方が違うのかと思ったので、次のように変えてみたところ、エラーになりました。 &jcode::convert(\$subject,'utf8','jis'); また、先頭にuse utf8;を付けてみたところ、送信できたものの文字化けが余計ひどくなりました。 インターネットで検索したり本を読んでみたりしても、よくわかりませんでした。 どうやったらJISに変換できるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • jcode.plが読み込めない

    ホスティングを使用しています。 plファイルについて、以前のサーバはちゃんと動作していましたが、 新しいサーバで、jcode.plが読み込めないらしくInternal Server Errorが出てしまっています。 階層は httpdocs--test.pl |--cmn--jcode.pl にしています。 ログを見ると [error] Can't locate cmn/jcode.pl in @INC 17行目部分、つまりrequire 'cmn/jcode.pl';があるところがエラーになってます。 以前は読み込めているのに、新しいサーバでは読み込めていない。 ちなみに ・パーミッションはちゃんと変更していますtext.pl[755] ・httpdocs自体は.htaccessでpl自体は動作できています つまり、 require行を外すとページはきちんと表示されます。 となると考えられる原因はなんでしょうか? そして対策方法を教えて頂ければと思います。 よろしくお願いいたします。

  • 改行

    お世話になります。CGIの基本設定で改行をする方法がわかりませんので教えて下さい。よろしくお願い致します。 # ライブラリ取込 require './cgi-lib.pl'; require './jcode.pl'; # タイトル $title = "タイトル"; ・ ・ ・ 略 ・ ・ # 名前 @name = ('A','B','C','D','E','F','G','H','I','J'); 改行をしたい場所はEです。 それともここで改行はできないのでしょうか?

    • ベストアンサー
    • Perl
  • perl jcode::convert 半角>全角

    perlでjcode::convertで 半角を全角に変換すると 正しく変換される時とされない時があります。 例えば、 sample1.plとsample2.plの my $message = 'の次の「ハンカク」の4文字は半角の文字です。 (注)ここにアップロードすると全角で表示されてしまいます。   この4文字を半角にして確認してください。 sample1.plではこの4文字が全角に変換されるのですが sample2.plではこの4文字は半角のままです。 なぜ全角に変換されないのでしょうか。 (Windows7, ActivePerl v5.16.3) ---sample1.pl------------ require "jcode.pl"; my $message = 'ハンカク文字は使えるかな?'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- ---sample2.pl------------ require "jcode.pl"; my $message = 'ハンカク文字'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- なお、どちらも以下のようなメッセージが表示されています。 これは何を意味しているのでしょうか。 defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 684. (Maybe you should just omit the defined()?) defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 693. (Maybe you should just omit the defined()?)

    • ベストアンサー
    • Perl
  • requireしたライブラリにuseを記入

    メール送信のプログラムを作っています。 本体のプログラムmain.cgiから、 メール送信用のサブルーチンを記入した、 email.plというのを require 'email.pl'; とメール送信が必要な場合だけ読み込んでいます。 この email.plに use Encode; や use Jcode; のようにuse文を記入するのは、 Perlの作法としては適切なのでしょうか。 それともuse文はmain.cgiに記入するのが適切なのでしょうか。 email.plにuse文を記入しても動きますし、 main.cgiにuse文を記入した場合とベンチマークを比べたりしましたが あまり変わらないのですが、 useはコンパイルしたときに実行されるので、 実行のときに読み込まれるrequireしたライブラリに記入していいのか不安なのです。 私としては必要なときだけ読み込みたいので、 email.plにuse文を記入したいのですが。 どうぞよろしくお願いします。

  • cgiがうまく動作しません。

    はじめまして。 現在独学でlinuxの勉強をしている者です。検索をしたり本を読んだりして対策を試みたのですがどうしても解決できないため、質問させていただきます。 環境は redhatlinux9 Apache2.0.40 です。 cgiを置いたディレクトリにブラウザでアクセスすると、 Internal Server Error と出てしまいます。 ログを見ると、 [error] 6099: ModPerl::Registry: Can't locate ./jcode .pl in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/li b/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/pe rl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i3 86-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_per l /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 .) at /var/w ww/cgi-bin/bbs/wforum.cgi line 11.! と表示されています。試しにwforum.cgiの11行目以下の require './jcode.pl'; require './fold.pl'; require './wf_init.cgi'; を require 'jcode.pl'; require 'fold.pl'; require 'wf_init.cgi'; と変更してみたところ、今度は (略)Can't locate fold.pl(略) at /var/www/cgi-bin/bbs/wforum.cgi line 12.! というエラーログが表示されました。 perlプログラムの文法、パーミッション、改行コード、FTP転送の際の転送モードは確認済みのため、問題ないと思われます。また、ここの過去ログを参考にして作成した #!/usr/bin/perl print<<EOF Content-type: text/html <HTML><BODY>CGI works Good.</BODY></HTML> EOF というtest.cgiは動作可能でした。 こういった場合、どのような原因が考えられるでしょうか。どうかご教授ください。よろしくお願いします。

  • perlで受取ったパラメータをバイトコードのまま変数に代入

    HTMLフォームの、name=aのテキストボックスに「あ」と入力しCGIにSubmitすると、a=%82%A0とバイトコードに変換されわたされますよね 受け側のCGIで下記の様にそのパラメータを$aに代入すると、$aには「あ」となって代入されるのですが、あえて「あ」ではなくバイトコードの「%82%A0」で代入するようにするには、どうしたらよいのでしょうか? #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; $a=$in{'a'};

    • ベストアンサー
    • Perl
  • 日本語文字化け(GETメソッド?)

    以下のようにすると日本語の受け渡しがうまくいきません。(抜粋) そももこの場合、日本語の受け渡しは、出来ないのでしょうか。 それともコンバートのやり方がまずいのでしょうか。 お知恵をおかしください。宜しくお願い致します。 URL:test.cgi?name=日本語 #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; # 読込 &getinput; $name = $form{'name'}; print "Content-Type: text/html\n\n", $name; exit; sub getinput { &ReadParse; while (($key,$val) = each %in) { &jcode'convert(*val, "sjis", "", "z"); $form{$key} = $val; } }

    • 締切済み
    • CGI

専門家に質問してみよう