- ベストアンサー
繰り返して表示するのではなく1つだけ・・
繰り返して表示するのではなく1つだけ表示させるソースをおしえていただけないでしょうか? 繰り返し表示されてしまうので"foreach"の部分を"if"に変えたのですが、今度は入力されたデータが表示されません。どうか教えてもらいないでしょうか? ----参照----- #foreach (@all){ if (@all){ # 1行の文字列をコロンを目印にして項目に分割する ($time, $name, $mail, $title, $message) = split(/:/, $_); # 1件分のデータを表示するサブルーチン &one_message; } close(KEIJI);
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
察するに、これの前を含めるとこんな感じですか? open(KEIJI, "<keiji.txt"); @all = <KEIJI>; foreach (@all){ ($time, $name, $mail, $title, $message) = split(/:/, $_); &one_message; } マニュアルを見れば一瞬で分かりますが、 foreachは、通常、foreach $variable ( @array ) の形で使われ、配列@arrayの中身を順に$variableに セットして、ブロック内を実行します。 で、$variableを省略したときには、$_に値がセットされます。 しかし、if( @all )では、変数$_に配列@allの中身がセット されないために問題が起こっています。したがって、 $_に、表示させたい@allの要素を明示的にセットしてやれば 良いのではないでしょうか?「1つだけ」ということですので、 @allの先頭の要素だけを表示するようにしてやると、 if( $_ = $all[0] ){ ($time, $name, $mail, $title, $message) = split(/:/); &one_message; } こんな感じです。これで、$_に@allの先頭要素をセットし、 その中身がちゃんと定義されている時だけ、ブロック内が 実行されます。 ちなみに、splitも少し変わっていますが、 タイプミスではありません。 splitもforeachと同様、第2引数を省略すると $_が使われます。
その他の回答 (1)
質問にもうちょっと補足が必要です(^_^; このルーチンが何をするプログラムの、どんな部分かが分からなければ、この質問だけでは何も答えられません。 こちらから見ると、1回だけ呼び出したいなら foreach と if の外側に &one_message を出してしまえばいいだけのことのように見えます。
お礼
これは言葉足らずで申し訳ないです。 こちらから見ると、1回だけ呼び出したいなら foreach と if の外側に &one_message を出してしまえばいいだけのことのように見えます。 ▲私も試しましたがこれをやると入力した言葉が表示されなくなってしまいます。なぜだろう。 補足ですが、このプログラムは単純にお問い合わせフォームを作り、これを指定したメールで送るという仕組みです。その中でも疑問のところは最後にメールを送ると同時にお問い合わせした内容をブラウザー上に表示させるというところです。そこで表示させるのに上記のやり方だと何個も表示されてしますということです。 言葉足らずで申し訳ありませんでした。 よろしくお願いします。