Perl CGIで外部ファイルをロードする方法

このQ&Aのポイント
  • Perl CGIで外部ファイルをロードする方法について質問です。futomi'sさんの高機能アクセス解析プログラムを改造し、データファイル「organization.dat」と「ipaddr.dat」を共有したいと思っています。
  • 具体的には、PerlのCGIスクリプトで「organization.dat」を読み込む部分がうまく機能していないようです。コードを記載していただいているので、それを元にどのように修正するかアドバイスをいただければと思います。
  • この問題について考えてみましたが、解決策が見つかりません。どなたかご教授いただければと思います。よろしくお願いします。
回答を見る
  • ベストアンサー

Perl CGI 「外部ファイルをロードするには...」

いつもお世話になります。今回もどうかお願いします。 今回は、futomi'sさんの高機能アクセス解析プロを改造して、データファイル 「organization.dat」と「ipaddr.dat」を共有したくて質問させて頂きます。 (取りあえず、前者だけ) どこかのサイトで、下記のようなコードがありました。 +--------------------- #!/usr/bin/perl my $host = "xxx.com"; //自サバの場合 my $file = "data/organization.dat"; use IO::Socket; print "Content-type: text/html\n\n"; my $files = "/"."$file"; my $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$host", PeerPort => "host(80)", ); unless ($remote){ die "cannnot connect to help daemon on $host"; } $remote->autoflush(1); print $remote "GET $files \n\n"; while (<$remote>){ print "$_"; } +--------------------- これをtest.cgiとしてサーバにアップすると、改行はしてくれないけど一応出力されます。 高機能アクセス解析(acc.cgi)で、organization.datを読込みしている部分は、 my %OrgList = &ReadDef('./data/organization.dat'); だと思います。 この部分が怪しいと思うのですが、どうしたら読込みできるでしょうか。 これ、ず~っと前から考えていましたが、もうギブアップです。 どうか教えて下さい。よろしく、お願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

&ReadDef はサブルーチンなので、 sub ReadDef { とかかれている部分を探して抜き出せばできると思います。

waterclock
質問者

お礼

おぉ!見事解決しました。 どうも、ありがとうございます。

関連するQ&A

  • perlのソケットがうまく作動しません。

    sakuraインターネットサービスでドメインを取得して、通常はそこでサービスを使っているのですが、このページの情報を、自分の持っているもうひとつのホームページ(プロバイダによって与えられたもの)上でも、データを引っ張り出して同じ情報を使いたいと思っているのですがうまくいきません。 どのようにしたらうまくいくものでしょうか? ご教授、宜しくお願い致します。 #!/usr/local/bin/perl $host = "domain.com"; $file = ""; use IO::Socket; print "Content-type: text/html\n\n"; $file = "/"."$file"; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$host", PeerPort => "host(80)", ); unless ($remote){die "cannnot connect to help daemon on $host";} $remote->autoflush(1); print $remote "GET $file HTTP/1.0\n\n"; while(<$remote>){ print "$_"; }

    • ベストアンサー
    • Perl
  • httpsクライアントについて

    以下のようなプログラムでhttpsクライアントを作ろうと思ったのですが 何も表示されません。どのようにしたらよいかアドバイスをいただけない でしょうか? #!/usr/bin/perl $url='https://www3.idpass-net.sia.go.jp/neko/action/z0401'; &process; print "Content-type: text/html\n"; print "\n"; print $lines; exit(0); sub process { undef $lines; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; ($host,$path) = $url =~m!^https://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'https(443)'); print $socket 'GET ', $path, ' HTTP/1.1', CRLF, 'Host: ', $host, CRLF, CRLF; my $headerN = <$socket>; $lines .= $data while read($socket,$data,1024) > 0; }

  • socket使用時の環境変数(REMOTE_ADDR)について

    色々調べても結局わかりませんでしたので もしお分かりになる方がいらっしゃれば 教えて頂ければ幸いです。 socketを使用するAというプログラムを作ったのですが、 そのプログラムからBというプログラムを呼び出した時、 Aに取得されるREMOTE_ADDRは、私のREMOTE_ADDRになるのですが、 Bに取得されるREMOTE_ADDRは、サーバのREMOTE_ADDRになってしまいます。 Bに対しても私のREMOTE_ADDRを取得させたいのですが、 方法はありますでしょうか? 具体的なSOCKET使用機構は以下のようになっております。 use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)', Proto => 'tcp'); select($socket); $|= 1; select (STDOUT); print $socket "POST $path HTTP/1.0",CRLF,CRLF; close($socket); どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • socketを用いたHTTPクライアントで別のサイトが表示されるのはなぜ?

    以下のようなプログラムでHTTPクライアントを実現しようとしたの ですが、指定したURL($url)と異なるサイトが表示されてしまう場合 があるのはなぜなのでしょうか?(Yahooのトップサイトなどほとんどの サイトは指定したとおりのサイトが表示されるのですが、Yahooの検索 結果(2番目のURL)や東証トップページ(3番目のURL)などは異なる サイトが表示されます。) #!/usr/bin/perl $url='http://www.yahoo.co.jp/'; #$url='http://search.yahoo.co.jp/search?p=%E6%A0%AA&n=30'; #$url='http://www.tse.or.jp/'; &process; print "Content-type: text/html\n"; print "\n"; print $lines; exit(0); sub process { undef $lines; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)'); print $socket "GET $path HTTP/1.0",CRLF,CRLF; my $headerN = <$socket>; $lines .= $data while read($socket,$data,1024) > 0; }

    • ベストアンサー
    • Perl
  • socketを使って外部のファイルを呼び込む

    $Host = 'abc.hogehoge.co.jp'; $Page = "/test_order.cgi?pass=1234&id=1234' $Addr = (gethostbyname($Host))[4]; $Name = pack("S n a4 x8", 2, 443, $Addr); socket(S, 2, 1, 0); connect(S, $Name); binmode(S); select(S); $| = 1; select(stdout); print S "GET $Page HTTP/1.0\r\n\r\n"; $Data = ''; while (<S>){ $Data = $_; } close(S); print"$Data"; 現在ある決済システムを組み込もうとしております。 上のように外部ホストのアクセスしてパスワードやID、その他あるのですがそれで接続していてもどうにも$Dataに出力されません。 print S "GET $Page HTTP/1.0\r\n\r\n"; とありますが外部ファイルはhtmlファイルではありません。たんなるテキスト文字が出力されるはずです。 直接ブラウザに https://abc.hogehoge.co.jp/test_order.cgi?pass=1234&id=1234' とたたくとテキストが出力されます。 なにかまちがっているのでしょうか? 恐れ入りますがご教授お願いします

    • ベストアンサー
    • CGI
  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • cgiでランダムにファイルを呼び出す方法

    下記、CGIにてランダムに2つのホームーページを呼び出しているのですが、インフレームなどで大量に呼び出した場合、ランダムさに欠けると感じているのですが、このコードをどのように改良すればよいでしょうか? それとも、もっと、大量の状態で実験しないと分からないものでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl my $base = './'; my @files = ('a.html', 'b.html'); my $count = @files; srand(); my $url = $base . $files[rand($count)]; print "Location: $url\n\n";

  • CGIでファイルが読み込めない

    CGI初心者です。 (osはlinuxです。) #!/usr/local/bin/perl use strict; use CGI; my $file=new CGI; open(DATA,"/home/data.txt"); $file=<DATA>; close=(DATA); print "Content-type: text/html\n\n"; print "data=$file"; このスクリプトで、/home/data.txt(フルパスです)に書かれているデータを1行だけをブラウザで表示させたいのですが、表示できません。 どこがおかしいのか教えてください。 ちなみにdata.txtには実際に「abc」という文字1行しか入れていません。

    • 締切済み
    • CGI
  • Apacheでcgiができないんです。

    以下のホームページと同じように、設定したのですが。。。 http://www.futomi.com/lecture/apache/config.html 下のcgiは実行できます。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>Apache</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<H2>Welcome to my computer, Apache Server!</H2>\n"; print "</BODY>\n"; print "</HTML>\n"; しかし、下のcgiは実行できません。htmlファイル、cgiファイル共に、あるホームページからコピペしたので、間違いないと思います。ここではhtmlファイルは書きませんが、以下のURLです。 http://www2j.biglobe.ne.jp/~apollo/server/apacuse.html #!/usr/local/bin/perl $countfile= "count.dat"; open(IN, "< $countfile"); $count = <IN>; close(IN); $count++; open(OUT,"> $countfile"); print OUT $count; close(OUT); print "Content-type: text/plain\n\n"; print $count;

    • ベストアンサー
    • CGI
  • PerlでHTML取得(その前にSocket取得)できない原因について

    下記コードを使い WEBサイトの更新日付を取得したいのですが 実行すると Socket Error:Invalid argument のエラーが表示されソケットの作成に失敗します。 Perlのバージョンは 5.8.0でウィルス対策ソフト停止後のコード実行等対策等を考えて行いましたが状況は改善されません。 よければ、どうしてソケットの作成に失敗するのか教えていただけないでしょうか? 失敗テストケース $host:www.google.co.jp # テストコード # モジュールの使用宣言 use IO::Socket; # URLを入力 $ur1 = <STDIN>; # URLをホスト名とファイルパスに分割 chomp($ur1); if ($ur1 =~ /http:\/\/([^\/]+)(\/.*)/) { $host = $1; $file = $2; } else { die "そのURLには対応していません。\n"; } # ソケットオブジェクト作成 $client_socket = new IO::Socket::INET { PeerAddr => $host, PeerPort => 'http', Proto => 'tcp', TimeOut => '5' }; unless ($client_socket) { print "Socket Error:$!\n"; } # 入力をサーバーに送信 print "$host $file" . "\n"; print $client_socket "GET $file HTTP/1.0\n\n";

    • ベストアンサー
    • Perl

専門家に質問してみよう