■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.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";
としたところ、文字列の間に+が表示されてしまいました。
文字列と数列がいまいち理解できていないせいかもしれません。
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.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.4
- 回答日時:
「テンプレートを読み込みません」というのはどう確かめたのでしょうか?
あと, とりあえず自分の作ったプログラムを冷静に見つめてください.
sub templateselect {
my $template = "";
if ($hoge eq 'abc'){
$template = "../../hoge/hoge/hoge.htm";
}
else{
$template = "../hoge/hoge/$path_2/";
}
my $template = templateselect;
の部分は明らかにおかしいでしょ?
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様
ご連絡遅くなりもうしわけございません。
ご丁寧にご教示いただきありがとうございました。
こちらの方法で試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
- PostgreSQL 【PostgreSQL】行の値の並びを変えるには 1 2023/03/21 16:46
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで複数の値を返す良い方法...
-
HASH(0xほげほげ)
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
文字の横にプルダウンを表示さ...
-
vscode 文字化け
-
formで特定のinputを送信しない...
-
FindFirst を複数条件で検索
-
シェルスクリプトで、空白(ス...
-
Pythonでターミナルに文字を出...
-
テーブル内でドロップダウンメ...
-
phpでボタンを押したときに変数...
-
パイソンプログラミング
-
パイソンのクラスについて
-
パイソンのクラスのブログラム
-
セレクトメニューで2つの項目...
-
【メモリ不足で落ちる(python)】
-
数値かどうかの判定方法
-
どちのほうがすきですか?
-
パイソンのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで複数の値を返す良い方法...
-
HASH(0xほげほげ)
-
プロトタイプ宣言のワーニング...
-
Pythonのプログラミングの質問...
-
print <<"_HTML_"の中でサブル...
-
Net::SSH::Perlについて
-
内部処理形式が日付型 (Date) ...
-
perlのスクリプトどこが間違っ...
-
Perlで use strict して our変数
-
変数に値を代入するのに、まずu...
-
連想配列とforeach
-
icmp socket error
-
Perl:計算誤差について
-
Perlで足し算をするには
-
PERLの「!=」と「=~」 or...
-
for文の中でのforeachの問題
-
PerlでCabochaを呼び出すには(...
-
Net::Telnetでタイムアウト時間...
-
[perl] next と return 同じ意...
-
Wコロン
おすすめ情報