
■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;
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__
ORUKA1951様
ご連絡遅くなりもうしわけございません。
ご丁寧にご教示いただきありがとうございました。
こちらの方法で試してみます。
No.4
- 回答日時:
「テンプレートを読み込みません」というのはどう確かめたのでしょうか?
あと, とりあえず自分の作ったプログラムを冷静に見つめてください.
sub templateselect {
my $template = "";
if ($hoge eq 'abc'){
$template = "../../hoge/hoge/hoge.htm";
}
else{
$template = "../hoge/hoge/$path_2/";
}
my $template = templateselect;
の部分は明らかにおかしいでしょ?
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 … )
とか・・
No.2
- 回答日時:
シングルクオートとダブルクオートの違いを理解すべし.
この回答への補足
Tacosan様
ご回答いただきありがとうございました。
ダブルクオート内の変数は展開されて代入されますが、
シングルクオート内の変数はただの文字列扱いになるのですね。
教えていただいた方法で、訂正を試して見ます。
ありがとうございます。
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;
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 のディレクトリトラバーサルは大丈夫?
この回答への補足
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();
}
bin-chan様
先日はご教授いただきありがとうございました。
教えていただいた方法で、
$path_1 = "$pdfno";
$path_2 = "$pdfno2";
$path_ok = "$path_1 + $path_2";
としたところ、文字列の間に+が表示されてしまいました。
文字列と数列がいまいち理解できていないせいかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlで2次元配列をサブルーチ...
-
Perlで、「が」を、「...
-
Perlのエラーについてご教授く...
-
openした後、closeしないでプロ...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
フローチャート 九九
-
perl の open について教えてく...
-
perlをバージョンアップしたら...
-
perlで2次元配列をサブルーチ...
-
perl 正規表現でエラー
-
bashスクリプト
-
perlでリテラル値はメモリにど...
-
perlについての質問
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
perl このテキストファイルを簡...
-
Wallpaper Engineでおすすめの...
-
Perlで同じフォルダにある任意...
-
perlで複数のファイルの処理に...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
おすすめ情報