
ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、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に入っています。
この回答への補足
ありがとうございます。わたしがいま作っているのはフォームメールなんです。名前、メールアドレス、電話番号、内容をかく欄。。。。と。どこにでもあるようなごくあたりまえのメールフォームなのです。が、最初のフォームを入力するページはHTMLで、HTML作成者が、フォームの項目を足したら、自動的に、その値もメールで送信できるような形のものを作っています。HTML製作者が
<input type="text" name=備考>
とタグをつけたすだけで値を自動的にメールに送信できるようにしたいなと。。それを実現するのはたぶんループさせる方法しかないと思うんです。
メールの中身が
[名前]:山田太郎
[電話番号]03-1234-5678
[メール]xxxx@hotmail.com
[問い合わせ内容]xxxxxxx
みたいな感じで送信されるようにしたいんです。
で、さきほど言ったようにフォーム入力ページにタグを追加しただけで
[名前]:山田太郎
[電話番号]03-1234-5678
[メール]xxxx@hotmail.com
[問い合わせ内容]xxxxxxx
[備考]xxxxxxx
と備考を追加させ、このような形でメールで送信させたいのです。
だけどなかなかループでまわした値をメールのサブルーチンにすべて渡せなくて。。。
こまったなあ・・・
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の部分が書かれたファイルを実行するようにすればいいのではないでしょうか?
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からメールを送信するときは、文字コード変換も気をつけてくださいね。
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 …
この回答への補足
はやばやのご返答まことにありがとうございます。
せっかく答えていただいたのにまだまだ勉強不足で理解できませんでした。これからもっと勉強します。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
yychatのcokkie機能がおかしく...
-
リファレンスをサブルーチンの...
-
一巡伝達関数と開ループ伝達関数
-
エクセルVBAで
-
jcode->jfold で禁則処理
-
二次元配列のつかいかた。
-
既存のBBSに返信機能の追加
-
画面を強制的に再描画させる方法
-
CやJAVa,Rubyなどプログラミン...
-
マクロ Publicでの配列定義
-
クラスに配列を渡す方法
-
レインボー色ってどうやって表...
-
C言語でファクト関数を使わずに...
-
なんでハッシュ関数はユーザー...
-
システム安定性(ゲイン余裕/...
-
英語でのシャープとコメの呼び...
-
イベントの発生を待つ
-
ごめんなさい 応用てきだとおう...
-
3から100までの素数を配列に入...
-
ハッシュ値が一致したデータは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
プロシージャとは
-
Perl実行時のメモリ不足について
-
ExcelVBAでのデータ型変換、も...
-
RFC822形式の日付を生成するサ...
-
COBOLから呼ばれる時
-
Perlの関数の引数について詳細
-
fortran77教えてください
-
${str}と$strの違いとは?
-
yychatのcokkie機能がおかしく...
-
渡された引数の型を判別する
-
リファレンスをサブルーチンの...
-
COBOLの日付操作
-
CGIのサブルーチンの呼び出...
-
パターンマチングについて(CGI)
-
Perlのmyのサブルーチンの内外...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
おすすめ情報