• ベストアンサー

引数の値をURLのパスに配列として代入

■1.下記の1.cgiからURLに引数として 1.cgi?hoge=●● で2.cgiにhogeの値を送ります。 2.cgiでhogeの値を受け取り、 テンプレートファイルを表示の際に下記のように、 ファイルのパスに取得したhogeを指定しようと思いますがうまく動作しません。 具体的な指示の仕方をご教示いただけないでしょうか? 宜しくお願いいたします。 my $hoge1 = '../../htdocs/●/●/●/'; my $hoge_2 = $hoge; my $hoge_ok = '$hoge1/$hoge2'; $template = $hoge_ok;

質問者が選んだベストアンサー

  • ベストアンサー
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.5

サンプル(SHIFT_JIS) _はタブに戻す /cgi-gin  |-- template.cgi  |-- template/     |-- 001.html     |-- 002.html hoge.com/cgi-gin/template.cgi/001.html #!/usr/local/bin/perl use strict; my $templatePATH = './template'; if (open TEMPLATE,$templatePATH.$ENV{'PATH_INFO'}){ _print "Content-Type: text/html; charset=Shift_JIS\n\n"; _while(<TEMPLATE>){ __print ; _} } else{ print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html><head><title>error</title></head><body><h1>エラー</h1>\n<p>テンプレートを指定してください。</p>\n"; print "</body></html>\n"; } __END__

sdzgq
質問者

お礼

ORUKA1951様 ご連絡遅くなりもうしわけございません。 ご丁寧にご教示いただきありがとうございました。 こちらの方法で試してみます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「テンプレートを読み込みません」というのはどう確かめたのでしょうか? あと, とりあえず自分の作ったプログラムを冷静に見つめてください. sub templateselect { my $template = ""; if ($hoge eq 'abc'){ $template = "../../hoge/hoge/hoge.htm"; } else{ $template = "../hoge/hoge/$path_2/"; } my $template = templateselect; の部分は明らかにおかしいでしょ?

すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

?以降の文字列(URLエンコードしたもの)は、CGIからは$ENV{'QUERY_STRING'}として利用できます。  多分されたいことは、要求されたPATHから、動的にページを作成するために、テンプレートを読み込んで、テンプレートを開き必要なデータを追記してページとして表示させようとされているのかな? いずれにしても、文字列の連結は my $PATH = '/data/template/'; ・・・ $PATH = $PATH.$hoge;#文字列連結演算子(.) でよいです。 その後、open Template とかで開けばよい。 なお、サーバーに何らかの値を渡す方法として、 QUERY_STRING・・・?以降(#があればその前まで)の因数を渡す。name=value     GET    URLエンコードして渡す(される) 標準入力・・・・・要求ヘッダに続いて、文字列で渡す     POST PATH_INFO・・・・・パスとして渡す     /news/20120126.html などがあります。  この様な場合、PATH_INFOとして渡すほうが処理は楽になると思います。そのまま利用できますからね。  たとえば/news/today/20120126.htmlを要求されると、hoge.com/news/today/20120126.htmlを作成して表示させるとか・・・ my $PATH = '/data/template/'; $PATH = $PATH.$ENV{'PATH_INFO'}; ★Enviroment Variable and FORM,COOKIE ( http://hpcgi1.nifty.com/Iruka/ENV_FORM.cgi/sdzgq/test.html ) とか・・

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

シングルクオートとダブルクオートの違いを理解すべし.

sdzgq
質問者

お礼

Tacosan様 ダブルクオーテーションの設定にて、 変数を足してパスを取得することができましたが、 設定できたパスは正しいのですが、テンプレートを読み込みません。 テンプレートのパーミッションも問題はないです。 これは別要因でしょうか? ディレクトリパスとして認識させるには、 変数を変換する必要があるのでしょうか? 下記、該当箇所になります。 宜しくお願いいたします。 $path_2 = "$hoge"; $errNum = chkFormInput(); fixTags(); sub templateselect { my $template = ""; if ($hoge eq 'abc'){ $template = "../../hoge/hoge/hoge.htm"; } else{ $template = "../hoge/hoge/$path_2/"; } my $template = templateselect;

sdzgq
質問者

補足

Tacosan様 ご回答いただきありがとうございました。 ダブルクオート内の変数は展開されて代入されますが、 シングルクオート内の変数はただの文字列扱いになるのですね。 教えていただいた方法で、訂正を試して見ます。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> my $hoge1 = '../../htdocs/●/●/●/'; > my $hoge_2 = $hoge; > my $hoge_ok = '$hoge1/$hoge2'; $hoge_ok には $hoge1 と $hoge2 の値を連結して代入したいのかな? ならば、 my $hoge_ok = $hoge1 + $hoge2;では? さらに、なぜ $hoge を代入する $hoge_2 にアンダースコアがあるのかな? 引数どうこう以前に、$hoge_ok に値を直接代入して動くのかな? $hoge1 のディレクトリトラバーサルは大丈夫?

sdzgq
質問者

お礼

bin-chan様 先日はご教授いただきありがとうございました。 教えていただいた方法で、 $path_1 = "$pdfno"; $path_2 = "$pdfno2"; $path_ok = "$path_1 + $path_2"; としたところ、文字列の間に+が表示されてしまいました。 文字列と数列がいまいち理解できていないせいかもしれません。

sdzgq
質問者

補足

bin-chanさん ご回答いただき誠にありがとうございました。 >さらに、なぜ $hoge を代入する $hoge_2 にアンダースコアがあるのかな? こちらは1との差別化のために入れておりまして、 特に意味はないのですが、アンダースコアがあることによって、 なにか障害が発生する可能性がございますでしょうか? >$hoge1 のディレクトリトラバーサルは大丈夫? こちらは、通常のテンプレートを読み込ます際に 問題なく表示されており、ディレクトリの相対パスの問題はないようです。 教えていただいた方法で確認をとりましたが、 cgiから送られた値が反映されずそのまま $hoge_2と表示されてしまいました。 現状1.cgiから渡された$hoge の情報は取得できています。 if文での動きも確認できます。 Elseの場合パスに「$hogeの値」が渡らず $hogeという文字のまま動いてしまいます。 値自体を渡す方法をご教授ください。 下記、該当perlになります。 ご指摘のほどよろしくお願いいたします。 #!/usr/bin/perl use CGI; require 'jcode.pl'; my $query = new CGI; my @html = (); my $hoge = $query->param('hoge'); my $errNum = 0; my $errMsg = ''; my $e_hoge = 0; my $t_hoge = ''; $errNum = chkFormInput(); fixTags(); sub templateselect { my $template = ""; if ($hoge eq 'abc'){ $template = '../htdocs/hoge/ok.html'; }else{ $template = '../htdocs/hoge/$hoge/index.html'; } my $template = templateselect; sub showHTML { foreach (@html){ print; } } #html表示選択 open HTML, $template or err("$templateが開けません"); print "Content-type: text/html; charset=Shift_JIS\n\n"; @html = <HTML>; close HTML; replaceTags(); showHTML(); exit(); sub chkFormInput { my $errNum = 0; } sub fixTags { if ($e_hoge){ $t_hoge = "<input type=\"hidden\" size=\"20\""; }else{$t_hoge = "$hoge<input type=\"hidden\""; }$t_hoge .= "name=\"hoge\" value=\"$hoge\">\n"; return 1; } sub replaceTags { foreach (@html){ s/<CGI:error message>/$errMsg/i; s/<CGI:error num>/$errNum/i; s/<CGI:hoge>/$t_hoge/i; } return 1; } sub err { print $query->header; print "<html><head><head><body>\n"; print $_[0]; print "\n</body></html>\n"; exit(); }

すると、全ての回答が全文表示されます。

関連するQ&A