![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、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で質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP php ログイン 1 2022/11/01 00:24
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サブルーチンの引数の、呼び出...
-
VBのReturnの使い方
-
perlの構文でわからない部分が...
-
パターンマチングについて(CGI)
-
ExcelVBAでのデータ型変換、も...
-
UWSCの終了の仕方
-
CSVファイルの特定の行だけを読...
-
画面を強制的に再描画させる方法
-
VBA for i=1 to lastrow
-
列挙型と連想配列の違いを教え...
-
null 参照の例外が実行時に発生...
-
UWSCのスクリプトで行き詰って...
-
DOSコマンドのループ内のTIMEコ...
-
ガレージバンド のサンプリング...
-
JSを使ったタブの別ページから...
-
無限ループの防ぐ方法
-
二次元配列における要素数のは...
-
ループフリー
-
javaのループ処理の結果を足し...
-
VBAで3秒だけ時間を止めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
プロシージャとは
-
Perl実行時のメモリ不足について
-
サブルーチン(共通の処理)の...
-
ExcelVBAでのデータ型変換、も...
-
COBOLの日付操作
-
スカラー変数をチェック
-
${str}と$strの違いとは?
-
foreachでループした変数を他の...
-
関数の戻り値に配列は設定できる?
-
$#{スカラー変数}とは何を意味...
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
どなたかこのプログラミングを...
-
VBAでの一時停止と再開の方法
-
VBA for i=1 to lastrow
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
おすすめ情報