• ベストアンサー

foreachでループした変数を他のサブルーチンに受け渡す方法を教えてください。

ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、sub mainの中の$dataをsub htmlの中で表示させて、sub mainでループさせた値をすべてsub mailへわたしたいのです、hiddenタグで<input type=\"hidden\" name=\"all\" value=\"$all\">とやってもうまくいきませんでした。@inの中をループさせるので@inをそのままかけばいいのでしょうか?これもうまくいきませんでした。。ようはループさせた値をすべてメールで送信したいのです。どうしたらうまくできますでしょうか? sub main{ foreach(@in){ ($name1,$value1) = split(/=/,$_); $data="$name1 : $value1"; print "$data"; print "<br>"; } sub html{ print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> &main; <form action="" method=""> <input type=\"hidden\" name=\"all\" value=\"$all\"> <input type=\"submit\" value=\"送信する\"> </form> </body> </html> EOF } sub mail { ####省略しますが、ここはメールの送信の記述です。 }

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

  • ベストアンサー
回答No.6

&mail(\@in); でsub mail{}を呼び出してそこに@inの中身を渡すことができます。実際は@inの中身を渡しているわけではなく、@inのメモリのアドレスを渡しているのですが、今はそのことは考えなくていいです。 sub mail{}で@inの中身を受け取るには、 sub mail{ my $ref = shift(@_); my @korekore = @$ref; } としてください。もうすこしエレガントな書き方がありますが、わかりやすくしました。 ずばりほしかった配列は@korekoreに入っています。

mikako_0413
質問者

補足

ありがとうございます。わたしがいま作っているのはフォームメールなんです。名前、メールアドレス、電話番号、内容をかく欄。。。。と。どこにでもあるようなごくあたりまえのメールフォームなのです。が、最初のフォームを入力するページはHTMLで、HTML作成者が、フォームの項目を足したら、自動的に、その値もメールで送信できるような形のものを作っています。HTML製作者が <input type="text" name=備考> とタグをつけたすだけで値を自動的にメールに送信できるようにしたいなと。。それを実現するのはたぶんループさせる方法しかないと思うんです。 メールの中身が [名前]:山田太郎 [電話番号]03-1234-5678 [メール]xxxx@hotmail.com [問い合わせ内容]xxxxxxx みたいな感じで送信されるようにしたいんです。 で、さきほど言ったようにフォーム入力ページにタグを追加しただけで [名前]:山田太郎 [電話番号]03-1234-5678 [メール]xxxx@hotmail.com [問い合わせ内容]xxxxxxx [備考]xxxxxxx と備考を追加させ、このような形でメールで送信させたいのです。 だけどなかなかループでまわした値をメールのサブルーチンにすべて渡せなくて。。。 こまったなあ・・・

その他の回答 (5)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.5

#1 さんの回答を良く見ていただければ分かると思います。 サブルーチンに飛ばすときに &mail( $name1, $value1 ); とすると、括弧の中身がサブルーチンに渡されます。 サブルーチン内での受取は、 特殊変数 $_ に入っているので、 (この場合複数なので @_ から取り出します) my( $n, $v ) = @_; として取り出しているのです。 分かりにくい場合はサブルーチンを使わないほうがいいかと思います。 # $send_mail がある場合はメールを送る。 if ($send_mail) { foreach(@in){ ($name1,$value1) = split(/=/); #メールを送る処理 } }

回答No.4

処理の流れは、 ------------------------------------------- フォームから何かを入力させる     ↓ 確認画面(?)を表示させる     ↓ 送信ボタンを押すと、メールが送信される ------------------------------------------- という感じなのでしょうか? それならば、sub mailの部分を別のファイルに分離させ、sub htmlで出力したページの送信ボタンを押したときにmailの部分が書かれたファイルを実行するようにすればいいのではないでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

sub html から sub main が呼ばれて、 sub main の内容を sub mail に渡すなら sub main で sub mailを呼び出せばいいと思います

mikako_0413
質問者

補足

ボタンを押して最後のサブルーチン(最後のサブルーチンはすいません、書いてませんでした。)にとんだときにメールを送信したいので、mainの中に書いてしまうとボタンを押す前にメールが送信されてしまうのでそれはできないんです。。。。お返事ありがとうございました。

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

sub html はどういった意図で、その中の $all が何を意味するのか判りませんが… > ようはループさせた値をすべてメールで送信したい この点だけに限り、以下の条件の下、次のようにしては駄目なのでしょうか? =条件= ・sub mail 内部で、SendMail(もしくはそれに相当)するメール送信部がある ・sub mail へ渡すデータは sub main内の@inの各データをまとめたもの =操作= foreach でループしていて、データのスプリットもされているので、文字列操作は出来るものと推測します。 ここで$dataという文字列データを作成していますが、 以下のように変えて、mailに渡してはいかがですか? $data .= "$name1 : $value1\n"; foreach を抜けた後、 &mail( $data ); で、いかがでしょう? 投稿いただいているソースで、&mainを呼んでいますが、ヒアドキュメント内ではうまくいかないかと思います。 (というより、sub htmlで吐き出そうとすると、エラーが出ませんか?) もし、各データひとつひとつを、それぞれ1通のメールデータとして渡したい、ということであれば、難しいことはなく、foreach内で&mail( データ )とすれば、よいかと思いますが。 =注意= CGIからメールを送信するときは、文字コード変換も気をつけてくださいね。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

こんな感じで; @in = qw( a=b c=d ); foreach ( @in ){ ( $name1, $value1 ) = split( /=/, $_ ); &html( $name1, $value1 ); } sub html { my( $n, $v ) = @_; print <<"_HTML_"; NAME: $n VALUE: $v _HTML_ } 詳しくはPerl標準添付ドキュメントperlsubに説明されてます。

参考URL:
http://www.cpan.jp/mirror/www.att.or.jp/perl/man/perlsub.1.html
mikako_0413
質問者

補足

はやばやのご返答まことにありがとうございます。 せっかく答えていただいたのにまだまだ勉強不足で理解できませんでした。これからもっと勉強します。 ありがとうございました。

関連するQ&A