フォームメールのCGIをPerlで作成しようとしていますが、
変数の使い方がうまくいきません。
ご指南お願いします。

フォームからのデータを受け取って変換したあとの項目に

$FORM{'name_1'} ~ $FORM{'name_60'}
$FORM{'naiyou_1'} ~ $FORM{'naiyou_60'}

とあります。

たとえば
name_1 に"名前"
name_2 に"住所"
naiyou_1に"田中"
naiyou_2に"東京都"
が入っているとして

内容確認のページに
【$FORM{'name_1'}= $FORM{'naiyou_1'}】
【$FORM{'name_2'}= $FORM{'naiyou_2'}】

=【名前 = 田中】
【住所 = 東京都】

と表示したく、

$k_name = "name_"
$k_value = "naiyou_";
for ($i = 1 ; $i <= 60 ; $i++){
$mailbody .= "$FORM{'$k_name.$i'} = $FORM{'$k_value.$i'}\n";
}

として

$mailbodyに追加していき、
最後に纏めて
print "$mailbody\n";
としようと思っていますが、
この状態で実行テストすると$mailbodyが何も入ってなく
空の状態のまま表示されます。

$i = 1 の時
$FORM{'$k_name.$i'}は
$FORM{'name_1'}と見ていないのでしょうか?

また、
$FORM{'$k_name.$i'}を
$FORM{'name_1'}と見るようにするには
どうしたら良いのでしょうか。

どなたか知恵をお貸し頂けませんでしょうか。
わかりにくい点がありましたら、補足致しますのでご指摘ください。
よろしくお願いします。

A 回答 (1件)

>$FORM{'$k_name.$i'}は


>$FORM{'name_1'}と見ていないのでしょうか?

$k_name.$iがシングルクォートで囲まれているのでそのままハッシュのキーを$k_name.$iと解釈しています。

for ($i = 1 ; $i <= 60 ; $i++){
$k_name = 'name_'.$i; $k_value = 'value_'.$i;
$mailbody .= "$FORM{$k_name} = $FORM{$k_value}\n";
}

としたらいいんじゃないでしょうか。
    • good
    • 0
この回答へのお礼

お早い回答ありがとうございます。
ご指摘の通り、''の内部はそのまま文字列として見てしまうんでしたね・・・

実はさんざん悩んで質問に至った訳なんですが、質問した途端に一番大事なところを記述し忘れているのに気付いたのです。

%FORM にそれぞれの値を代入する一文
例 : $FORM{$name}=$value;
を忘れてしまっていたので、この質問の内容では解決できないものでした・・・(^_^;)

お答えいただきましたのなんだか申し訳ございません。

しかし、上記の一文を記述していたとしても
""''の違いによる解釈の違いはあったのですから、良回答でポイントを差し上げたいと思います。

ありがとうございました。(^_^)
また、いつかこのサイト内で出会える事を願っています。

お礼日時:2002/04/12 10:12

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

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

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データを受け取る方法を調べてごらん

Q$in{'~'}を$~に変換

CGIを改造中です。
変数の処理なのですが、サブルーチン内で利用するときに「$in{'~'}」と言う形でしか表示してくれません。これを「$~」の形にしたいです。
数が少なければ「$~ = $in{'~'}」を個数書けばいいのでしょうけど、結構数があるので、何か簡単な方法で変換できないかと考えています。
良い方法があれば教えてください。

Aベストアンサー

ハッシュのままで何か不都合があるのかなと
疑問に思いつつ・・・
#実際ハッシュは
#「(変数の)値に別の値を対応させる」
#ために存在するわけだから

けど,まあ,やろうと思えばkeys関数でできますよ.

%in=(
'X' => 1,
'Y' => 2,
'Z' => 3,
);

for $key (keys %in){
${$key}=$in{"$key"};
print "key; $key ${$key}\n";
}

print "$X $Y $Z";

strictとwarningsのプラグマを外さないといけないので
副作用の方が大きいでしょうが.

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$ENV{'HTTP_COOKIE'}は例えば

a=x;b=y;c=z;
のようなフォーマットになっているのでしょうか?
そうすると
自分のサイトが使っているクッキー名と
他のサイトが使っているクッキー名が偶然に一致していたとき
あるブラウザに書かれている自分のサイトのクッキーが
そのブラウザが他のサイトをアクセスしたときに上書きされてしまうのでしょうか?
そのためにクッキー名をつけるときには偶然に一致しないように一定の長さ以上で特異な名前にしたほうがいいのでしょうか?
クッキーについて基本的なことを教えてください

Aベストアンサー

Cookieは、ドメインごとに設定され、パスで出力先が限定されます。パス指定されない場合、ドメインのルートパスとなります。

おっしゃる通り、同一ドメイン内で設定されたCookieが、全てHTTP_COOKIEで取得出来ます。(無論ドメインが違うと駄目。)もしも、Cookieにパス指定がある場合は、そのパス以下では該当のCookieが取得可能、それ以上の階層では取得不可能になります。(デフォルトだとルートパスなので、ドメイン内のどの階層でも取得可能です。)

このような仕様の為、同一ドメイン・パス指定以下の階層で利用されるものでは、偶然一致してしまうと、他のクッキーを上書きしてしまう可能性はあります。他と重複しない用に、プログラム名等を含ませる形で名付けてあげると良いでしょう。また、共用サーバなどでは、パス指定で自分のホームを指定しておき、他の方のクッキーと混同されないようにする、等の配慮が必要になります。

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はいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。


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

おすすめ情報