アプリ版:「スタンプのみでお礼する」機能のリリースについて

繰り返して表示するのではなく1つだけ表示させるソースをおしえていただけないでしょうか?
繰り返し表示されてしまうので"foreach"の部分を"if"に変えたのですが、今度は入力されたデータが表示されません。どうか教えてもらいないでしょうか?

----参照-----
#foreach (@all){
if (@all){
# 1行の文字列をコロンを目印にして項目に分割する
($time, $name, $mail, $title, $message) = split(/:/, $_);

# 1件分のデータを表示するサブルーチン
&one_message;
}
close(KEIJI);

A 回答 (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引数を省略すると
$_が使われます。
    • good
    • 0

 質問にもうちょっと補足が必要です(^_^;


 このルーチンが何をするプログラムの、どんな部分かが分からなければ、この質問だけでは何も答えられません。

 こちらから見ると、1回だけ呼び出したいなら foreach と if の外側に &one_message を出してしまえばいいだけのことのように見えます。
    • good
    • 0
この回答へのお礼

これは言葉足らずで申し訳ないです。

こちらから見ると、1回だけ呼び出したいなら foreach と if の外側に &one_message を出してしまえばいいだけのことのように見えます。

▲私も試しましたがこれをやると入力した言葉が表示されなくなってしまいます。なぜだろう。

補足ですが、このプログラムは単純にお問い合わせフォームを作り、これを指定したメールで送るという仕組みです。その中でも疑問のところは最後にメールを送ると同時にお問い合わせした内容をブラウザー上に表示させるというところです。そこで表示させるのに上記のやり方だと何個も表示されてしますということです。
言葉足らずで申し訳ありませんでした。

よろしくお願いします。

お礼日時:2001/09/09 21:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!