繰り返して表示するのではなく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で質問しましょう!

このQ&Aと関連する良く見られている質問

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Qforeach (1..4){ 英文字$_→$新しい変数として使いたい

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = "a$_";
print <<"HTML";
$view<BR>

HTML
}

の時、$viewに$a1~$a5の値を表示させるようにしたいのですが、上記の場合ですとa1~a5として表示されます。

foreachで$_で順に数字をaと組み合わせて出来た文字列を変数として使い、元々指定してある値を取得するようにしたいのです。

どのようにすれば解決できますでしょうか。ご掲示頂けましたら幸いです。

Aベストアンサー

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = ${"a$_"};
print <<"HTML";
$view<BR>

HTML
}

Q@{$protocol_name}

usr strict;
をつかって、

$protocol_name = "pppoe";

@{$protocol_name}

のような使い方をしたいと思っていますが、

Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7

のようにエラー表示がでてしまいます。
どうしたら回避できるでしょうか。

Aベストアンサー

@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。

・ハッシュにハードリファレンスで格納する方法
$protocol{pppoe} = \@pppoe; # 代入
@{$protocol{$protocol_name}} # 参照
# @pppoeとしましたがもちろん無名配列でかまいません。

・分岐させる方法
if($protocol_name eq "pppoe"){
... = @pppoe;
}elsif ...

・シンボリックリファレンスだけ許可させる方法
no strict 'refs';

・%main::から引く方法
@{$main::{$protocol_name}}


このカテゴリの人気Q&Aランキング

おすすめ情報