@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Perlでの文字列内変数の扱いについて

1
投稿者投稿内容
JINKI
会議室デビュー日: 2005/03/09
投稿数: 4
投稿日時: 2005-03-09 18:43
初めて投稿させて頂きます。

現在表記の件で悩んでいます。
googleで検索したのですが、検索文字列が悪い為か探せませんでした。
ヒントとなる事もしくは、検索キーをご教授頂ければ幸いです。

状況と致しましては以下の通りです。

・複数の人間が同じプログラムを使用する。
・一部を除いてHTMLは常に不変である。
・一部、別ファイルから文字列を取得し、それをHPに表示する事でカスタマイズが出来る。
・取得したリクエストで受け取ったIDを次のページに渡す必要が出てきた。
(例のA.txtの3行目)

例)
A.txt -------------------------------------------------------------
<images ・・・・・ >
ようこそお越しくださいました。
<a href="http://www.・・・.jp/test.php?Id=${var1}" target="_blank"><font size="1">あるページに飛びます</font>
-------------------------------------------------------------

test.cgi ------------------------------------------------------------
use CGI;
$q = new CGI;
$var1 = $q->param('ID');#ゲットで取得した値
print <<EOF;
HTMLが書いてある。
EOF
open (IN,"./${var1}/A.txt");
while($tmp = <IN>){ print $tmp;}
close(IN);

print <<EOF;
HTMLが書いてある。
EOF
------------------------------------------------------------

質問させて頂くのに欠けている情報等がありましたら、
ご指摘お願します。
JINKI
会議室デビュー日: 2005/03/09
投稿数: 4
投稿日時: 2005-03-09 18:57
大変申し訳ありません。
一番肝心な、何が知りたいかが抜けていました。

上記の例を動かすと、変数が唯の文字列として扱われてしまいます。
プログラムが実行され書かれたHTMLは以下のようになってしまいます。

・・・
<images ・・・・・ >
ようこそお越しくださいました。
<a href="http://www.・・・.jp/test.php?Id=${var1}" target="_blank"><font size="1">あるページに飛びます</font>
・・・

となります。
希望する挙動は以下の通りです。(前画面からID=001を受け取った場合)

・・・
<images ・・・・・ >
ようこそお越しくださいました。
<a href="http://www.・・・.jp/test.php?Id=001" target="_blank"><font size="1">あるページに飛びます</font>
・・・


[ メッセージ編集済み 編集者: JINKI 編集日時 2005-03-09 18:58 ]
うっちー
常連さん
会議室デビュー日: 2004/08/12
投稿数: 32
投稿日時: 2005-03-09 22:14
こんばんわ。

引用:
while($tmp = <IN>){ print $tmp;}



上記の部分で

while($tmp = <IN>){
$tmp =~ s/¥${var1}/$val1/g;
print $tmp;
}

として置換してみたらダメですか?
(¥は小文字です。。)
JINKI
会議室デビュー日: 2005/03/09
投稿数: 4
投稿日時: 2005-03-09 22:45
ご返答ありがとうございます。

別テキスト(A.txt)で使用される変数は1つとは限らないので、
うっちー様に教えて頂いた方法を参考に、全変数を置換する方法を使わせて頂きます。
本当にありがとうございました。


ただ、文字列として扱われている$・・・を変数として扱う事が出来ないかなと考えていたので、これは継続して考えようと思います。
何か方法がありましたら、ご教授お願いいたします。

私もちゃんとperlという言語の仕組みから勉強し直してみます。
その上で不可能か方法があるのか、結局分からないのか報告させて頂きます。
会社員
ベテラン
会議室デビュー日: 2003/01/21
投稿数: 50
投稿日時: 2005-03-09 23:38
これでは?

$tmp =~ s/¥${(.*?)}/${$1}/g ;
おさるわん
会議室デビュー日: 2004/11/10
投稿数: 7
投稿日時: 2005-03-11 11:43
while($tmp = <IN>){
$tmp_x = eval "qq{$tmp}" ;
print $tmp_x;
}

変数が評価されればいいんですよね?
これ試してみてください。
ただし,Javascriptのfunction{ の部分とか食べられちゃう部分があるので
\(円マーク)とかでエスケープが必要な部分が出るときがあります。
JINKI
会議室デビュー日: 2005/03/09
投稿数: 4
投稿日時: 2005-03-22 13:55
会社員様・おさるわん様 ご教授ありがとうございました。

>会社員様
ご指定頂いた方法では変換されませんでした。

>おさるわん様
記載して頂いた通りの方法で、変換(評価)されました。
Evalという、文字列として扱われている式や関数や変数を評価してくれる関数があるんですね。

今回、質問をさせて頂き非常に勉強になり、同時に自分の不勉強さに気付きました。
ご返信を頂いた皆様、貴重な時間を割いて頂きありがとうございまいした。
iWA
会議室デビュー日: 2005/03/30
投稿数: 1
投稿日時: 2005-03-30 17:48
この手のプログラムを作成する場合には、クロスサイトスクリプティングに十分注意しましょう。
IDに「"><script language="JavaScript" src="..."></script>」のような値を入れられて、今話題のフィッシング詐欺などに悪用されてしまいます。
1

スキルアップ/キャリアアップ(JOB@IT)