• ベストアンサー

perlで

$xが1に等しかったら ブラウザクライアントに 1.html を送り表示させ $xが0に等しかったら ブラウザクライアントに 0.html 送り表示させる ようにCGIファイルを作ることはできるでしょうか? ($x例えばはPOSTで受け取った変数です) 1.htmlや0.htmlを読み込みprintで一行ずつ書いていくことしかできないのでしょうか?

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

  • ベストアンサー
  • arcsin
  • ベストアンサー率70% (28/40)
回答No.2

#1の方と同じですが、javascriptを使うか、locationをつかうかmetaを使うのが手っ取り早い方法でしょう。 javascriptはoffにされてしまうとどうしようもないので、locationかmetaの方法に絞られます。 locationを使う場合($xには0か1のどちらかが入っていると保証されているとして)、Content-type:text/htmlを出力する前に、 print "Location:./$x.html\n\n"; 等すればいいと思います。ただしlocationヘッダはサーバによっては使えません。使えないサーバであればmetaの方法が有効です。 metaを使う場合、 print "Content-type:text/html;\n\n"; print "<html>\n"; print "<head>\n"; print "<META HTTP-EQUIV="Refresh" CONTENT="0; URL=./$x.html"> print "</head>\n"; print "</html>\n"; とすればよいでしょう。

guuman
質問者

お礼

丁寧な説明ありがとうございます metaを使いたいと思います

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

その他の回答 (1)

noname#191236
noname#191236
回答No.1

こんばんわ。 暇なので投稿します。(爆 転送させたいという事でいいのでしょうか? (要は0&1.htmlは静的なページでOKなのかどうか) 転送させたいだけならば、ロケーションヘッダを 出力させればいいと思います。(URL参照) それでは。

参考URL:
http://easycgi.xrea.jp/tips/perl/location.htm
guuman
質問者

お礼

ありがとうございます 条件判断で転送先を変えたかったのです 参考にします

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

関連するQ&A

  • Perlでのマッチング処理について

    検索CGIを作成しているのですが、検索文字に「ー」(-ハイフンではありません。日本語入力の言葉を伸ばすやつです。”サーバ”とか。)が入った文字を指定し、POSTするとServerErrorになってしまいます。サーバはレンタルものなので原因が分からず途方にくれています。どなたかPerlに詳しい方、ぜひよいアドバイスを下さい。ちなみに処理は下記のように行っています。 (1)検索する元のデータはsjisである。  ↓ (2)ブラウザのフォームから、検索したいデータがsjisでPOSTされる。  ↓ (3)ReadParseにてデータを変数へ取り込む。(cgi-lib.pl使用)  ↓ (4)CGIにて、POSTされたデータをeucへ変換。(jcode.pl使用)  ↓ (5)検索する元のデータが入ったファイルをオープン。  ↓ (6)ファイルから1行づつ読み込み変数へ格納。  ↓ (7)変数へ格納したデータをeucへ変換。  ↓ (8)if (${POSTされたデータ} =~ /${ファイルから読み込んだデータ}/)といった形でマッチング処理  ↓ (9)ファイルをクローズし、マッチングしたデータをsjisで結果表示。 ※まだデバッグ途中なのですが、とりあえず今判明しているのは 『インターネット』などというふうに、『ー』がキーに入るとエラーになります。 どなたかよろしくお願いします。

    • ベストアンサー
    • Perl
  • perlのcgiで、変数の中身を表示させたい

    cgiで変数の中身を表示させたい perlのcgiで変数の中身を表示させたいのですが、うまくいきません ▽環境   レンタルサーバ ▽やりたいこと   通常のブラウザ画面に、変数の中身を表示させたい ▽現状   use Data::Dumper;   print Dumper($hoge));もしくは、warn Dumper $hoge;   とすると、下記エラーとなります Script Error The script did not produce proper HTTP headers. Please see the error log to see the detail of the errors. Depending on the server configuration, you can also run thisscript under CGIWrap debugging. Usually, either rename or linkthe script temporarily to a file which ends with .cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file. 指示に従い、.htaccessへ、AddHandler cgi-script-debug .cgiを追記すると、ズラズラ出てきたと何か出てきた中の一行に、変数の中身が表示されます ■質問事項   ▼変数の中身を確認する際、いちいち.htaccessへ追記するのが面倒なのですが、どうやって回避するのでしょうか?   ▼なぜ、変数の中身を確認しようとしただけで、Script Errorとなるのでしょうか?   ・書き方を間違えている?   ・書く場所を間違えている?   ・レンタルサーバの仕様?   ・perlのcgiだから? イメージしてるのは、PHPのvar_dumpなのですが…

    • ベストアンサー
    • Perl
  • レンタルサーバーでperlのcgiファイルを実行する手順を教えて下さい

    レンタルサーバーでperlのcgiファイルを実行する手順を教えて下さい。 レンタルサーバー会社からは、「cgi-bin」フォルダにcgiファイルを配置(アップロード)すれば ブラウザで見れると説明を受けました。 用意したcgiファイルは以下の内容です。 _____________________________ #! c:/perl64/bin/perl # CGIヘッダーの出力 print "Content-type: text/html\n\n"; #さいころを振る。 $n = int(rand 6) + 1; #HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0.1//EN\">\n"; print "<html>\n"; print "<head><title>Perlでさいころ</title></html>\n"; print "<body>"; print "<p>さいころの目は<big>$n</big>です。</p>\n"; #御言葉を出力 if($n == 4){ print "<p>ふ、不吉な・・・。4が出ました。</p>\n"; } print "<body></html>"; __________________________________________ 一行目が原因でしょうか。ローカルで作成した、cgiファイルをレンタルサーバーに配置(アップロード)し ブラウザから見たいと考えております。 ご存知の方、教えて頂けないでしょうか。 宜しくお願いします。

  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • cgiの変数をhdmlに渡すことはできますか?

    hdmlコンテンツを作成しているのですが、hdmlのファイル#1からgosubでcgiのファイル*1に行き、printをつかってhdmlのファイル#2を表示しています。そのファイル#2にcgiのファイル*1で処理した変数を渡し、再びcgiのファイル*1に行きたいのですが、うまく行きません。 このような処理は不可能でしょうか? 下記のソースの$s1,$s2の部分が処理した変数になります。 print "Content-type:text/x-hdml;charset=Shift_JIS\n\n"; print <<"EOT"; <HDML VERSION="3.0" PUBLIC="TRUE"> <display name="test"> 進む <action type=accept task=gosub dest=*1.cgi label=進む method=post postdata=s1=$s1&s2=$s2> </display> </HDML> EOT

    • 締切済み
    • CGI
  • perl アップロード

    http://hole.sugutsukaeru.jp/archives/10 こちらのサイトでPerlでのファイルのアップロードを行なおう思い、 作成しているのですが、 エラーになり表示されません。 コードを貼り付けると、 #!/usr/bin/perl -w #使用するモジュールをロード use File::Basename; use CGI; #変数宣言 my ($form, $dir, $filename, $parsename, @filename, $error, $ok, $type, $newfile, $i, $buffer, @ext_ok); #ファイルを保存するディレクトリを設定 #(CGIの実行ユーザで書き込み権限が必要) $dir = './files'; #受付可能な拡張子(正規表現) @ext_ok = qw ( txt zip pdf doc cgi ); #CGIオブジェクトを作成 $form = new CGI; #転送できるファイルの最大サイズを設定 #(実際は、post送信されるコンテンツ合計の最大サイズ) #この値は、CGIオブジェクトを作成する時には既に #設定されていなければならない $CGI::POST_MAX = 1024 * 1000; #max = 1MB #CGIオブジェクトを作成 $form = new CGI; #クライアントにヘッダを送信 #これは、結果メッセージ表示のため binmode STDOUT; print "Content-Type: text/plain;charset=euc-jp\r\n\r\n"; #ファイルの転送のチェック if (!defined($filename) and $error = $form->cgi_error){ #ファイルが転送されていなかったら、$filename は 未定義値となっている。 #フォーム上でファイルを選択しないままフォームがサブミットされた場合は、 #通常はこの変数 $filename は空文字列として定義されている(=未定義ではない)。 #このため、以前のバージョンでは $filename が定義されている #かどうかをエラーの判別の基準としていたが、 #2007年3月 Mac OS X 上の Netscape 7.1 で試したところ、 #ファイル選択されていない場合に未定義値になることが判明。 #このため、エラーの場合に設定される(筈の)値 $form->cgi_error も判別の #基準に追加した。 print "ファイルが転送できませんでした:$error\n"; exit; } if ($filename) { #ファイルが転送されていれば、値は真 #ファイルパス内の「\」を「/」に変換 # $parsename には、送信元クライアントマシン内での #ファイルパスが格納されている。 #注:Shift_JISで実装する場合、このあたりには工夫が必要。 $parsename =~ s#\\#/#g; #ファイル名を(ベース名, ディレクトリ名, 拡張子)に分解 @filename = fileparse($parsename, "\.[^\.]+"); #ベース名のチェック(アスキー文字列であること) $filename[0] =~ /^[\.\w~-]+$/ and $filename[2] =~ /^[\.\w-]+$/ and $ok = 1; unless ($ok) { $error = 'ファイル名は、半角英数字にして下さい。'; print "ファイル転送ができませんでした。: $error\n"; exit; } $ok = 0; #フラグのリセット #拡張子のチェック foreach (@ext_ok){ $filename[2] =~ /^\.$_$/ and $ok = 1 and last; } unless ($ok){ $error = "許可されていない拡張子($filename[2])です。"; print "ファイル転送ができませんでした。: $error\n"; exit; #サーバ側ファイル名の決定 #まず、セッションごとに一意のディレクトリ名を作成 while (-d "$dir") { $dir = $dir.'/upload_'.&gen_unique_key(15); } #ファイルを格納するディレクトリを作成 unless (mkdir($dir, oct(777))){ print "保存ファイル用ディレクトリの作成に失敗しました。: $!\n"; exit; #サーバ側のファイルパスを設定 $newfile = $dir."/".$filename[0].$filename[2]; #既に同名のファイルが存在した場合 #(複数の同名ファイルを同時にアップロードした場合など)は、 #ベース名にアンダースコアと番号を付けて別名にする $i = 0; while (-f "$newfile"){ $i++; $newfile = $dir."/".$filename[0]."_".$i.$filename[2]; } #ファイルの保存 unless (open (OUTFILE,">$newfile")){ print "サーバ側の保存ファイルの作成に失敗しました。: $!\n"; exit; } #保存用ファイルを無事 open できた場合 #改行コードの自動変換を停止 binmode (OUTFILE); binmode ($filename); # $filename から内容を読み出して #保存用ファイルに書き出す #この場合、変数 $filename はファイルハンドルとして #機能する while (read($filename,$buffer,1024)) { print OUTFILE $buffer; #ファイルを close して終了メッセージを表示 #この場合、$filename は、送信元クライアント #マシン内でのファイルパス(ブラウザが送信してきた値)を返す close (OUTFILE) and print "送信されたファイル ($filename) を右のファイル名で保存しました: $newfile\n" or print "サーバ側の保存ファイルのクローズに失敗しました。: $!\n"; } else { # ファイルが転送されていない場合 # $filename は 偽 print "ファイルはアップロードされていません。\n"; } #一意の文字列を作成するための関数 sub gen_unique_key($){ #生成する文字列の長さを引数で指定 my $length = shift; my ($i, $tempval, $key, $chars, @chars); #引数で指定された文字列長さが、 # 5以上 30以下の数値でない場合、15に設定 #(範囲は、長からず短からず...。) ($length =~ m/^\d+$/ and $length >= 5 and $length <= 30 ) or $length = 15; #使用する文字を指定(ディレクトリ名として使用できる文字を指定する) $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~-_'; @chars = split(//, $chars); #乱数のタネを作る srand(time|$$); for ($i=0; $i<$length; $i++){ # @chars 配列の最大の添字までの乱数を生成する $tempval = int(rand(scalar(@chars))); $key .= $chars[$tempval]; } return $key; } となりますが、どこが間違えているのでしょうか。 上記コードは、サイトからのコピペになります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl で出力するHTMLファイルを任意の場所から表示

    CGI の中でprintを使ってHTMLファイルを出力することができますが、ブラウザで任意の場所を先頭に(スクロールさせて)表示させることができるでしょうか? hogehoge.cgi ------------------------   ・   ・ <a name="label01"> print "AAAAA<BR>"; <a name="label02"> print "BBBBB<BR>"; <a name="label03"> print "CCCCC<BR>";   ・   ・ ------------------------ 上のような場合で、 ブラウザで"BBBBB"を先頭に (label02 の位置にスクロールさせて) 表示させたいのです。 hogehoge.cgi#label02 で呼び出せばいいというのは 駄目です。 cgi の中で、処理によって表示の位置を label01, label02, label03 と ダイナミックに切り替えたいからです。 HTMLヘッダで Refresh を指定して、 再読み込みさせることもできますが、 携帯電話のブラウザではうまくいかないので、 別の方法をご教授ください。

    • ベストアンサー
    • Perl
  • ファイル間の変数引き継ぎ方法を教えてください。

    初心者です。初歩的な内容ですみません。 cgiのファイル間で変数を引き継ぎたいです。 入力.html  (postで変数を引継ぎ)  ↓ 処理1.cgi (html吐き出しなし)(変数追加・改めてpostのような形で引継ぎ)  ↓ 処理2.cgi (変数利用) cookieや ファイル名.cgi?key=変数 と言う形ではなく htmlのpostのようなことをcgiでもやりたいです。 よろしくご指導お願いいたします。

    • ベストアンサー
    • CGI
  • perlの内容なのですがこれで合っていますでしょうか?

    print 関数は文字列や数値だけでなく、変数を指定してその値を表示することもできます。 $a=1; 1を$aに代入する。 print $a; 変数$aの値を表示させる。 $a=2; 変数$aに2を代入する。 $b=3; 変数$bに3を代入する。 print "変数\$aに変数\$bを代入\n"; 「変数$aに変数$bを代入」という文字を表示させて改行する。 $a=$b; 変数$bの値を変数$aに代入する。 print "\$a="; 「$a=」を表示させる。 print $a; 変数$aの値を表示させる。 print ",\$b="; 「,$b=」を表示させる。 print $b; 変数$bの値を表示させる。 print "\n"; 改行を表示させる。 実行結果は↓↓↓↓↓↓↓ 変数$aに変数$bを代入 $a=3,$b=3 変数の書き方 文は ; で区切るが、1行に並べることも可能。 $a=2; $b=3; ↓ $a=2; $b=3; 複数の変数に、同時に値を代入することも可能。 $a=2; $b=2; ↓ $a=$b=2;

    • ベストアンサー
    • Perl
  • CGIでテキストボックスの内容によって条件分岐

    CGI超初心者です。 htmlファイルに設置したテキストボックスの値によって CGIで表示させる内容を変えたいです。 ネットで検索してコードを作成してみたのですが うまくいきません。 どのように修正すればいいのでしょうか? test.html---------------------------------------- <FORM action="test.cgi" method="POST"> 変数を入力 <INPUT type="text" name="hen"> <INPUT TYPE="submit" VALUE="送り"> </FORM> ------------------------------------------------- test.cgi----------------------------------------- #!/usr/local/bin/perl $h = $FORM{'hen'}; print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head><title>サンプル</title></head>\n"; print "<body>\n"; if ($h > 50) { print "<p>変数hの内容は50より大きいです。</p>\n"; } else { print "<p>変数hの内容は50より小さいです。</p>\n"; } print "</body>\n"; print "</html>\n"; exit; ------------------------------------------------- テキストボックスに、50以上の数字を入力しても、50以下の数字を入力しても どちらも 「変数hの内容は50より小さいです。」 と表示されてしまいます。 よろしくお願いいたします! ※ 前回の質問(http://okwave.jp/qa/q8179935.html) より、CGIは使わない方向で検討中ですが CGIに途中まで足をつっこんでしまい、 気になったので質問させていただきました。

    • ベストアンサー
    • CGI