電子書籍の厳選無料作品が豊富!

perlの最適化に取り組む際のa.outについて
下記IBMのサイトを参考にperlの最適化について取り組んでいます。
http://www.ibm.com/developerworks/jp/linux/libra …

現在、意図しているscript.plでは、http://.../script.plにアクセスした場合、現状エラーのない状態です。

その状態で素直に、
$ perlcc -B script.pl
を実行し、a.outというファイルが出来るのを確認しました。
shell上で
$ a.out
を実行すると、ウェブにアクセスした場合に表示される画面が表示されます。
$ mv a.out /var/www/lib/db/Atest
としてリネームしました。
その後、一応パーミッションも実行権限付けました。

●test.cgiとして下記を作成しました。
#!/usr/bin/perl

use lib '/var/www/lib/db';
unshift @INC, '/var/www/lib/db';

use utf8;
use open ":utf8";
use open ":std";

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

#1.
system(Atest);

#2.
foreach(`Atest`){
print $_;
}

#3.
open(OUT, "| Atest|");
print OUT;
close(OUT);

1;

Atestの実行結果をWebからのアクセスで表示可能にならないか検証しているのですが、画面は真っ白な状態です。
サーバーのerror.logにも何も表示されません。

上記IBMのサイトで解説されている
抜粋:「perlccはCソースに埋め込まれたものを生成します。このCソースが、完全なスタンドアローンの実行可能ファイルにまでコンパイルされます。」
とあるように、Cが分かっていないと駄目なのでしょうか

Webからアクセス時、表示可能なようにするにはどのようにすれば良いかご教授頂けませんでしょうか

A 回答 (1件)

おそらく


1. system('./Atest');
2. foreach(`./Atest`);
3. open(OUT,"./Atest|");
とかでいけると思いますが、
それ以前に、test.cgi の存在そのものが無駄です。

コンパイルしたバイナリそのもの(perlcc が出力した a.out)を
test.cgi という名前にリネームするだけで十分です。

CGI とは、「WWWサーバから、ユーザープログラムを呼び出すためのルール」です。そのルールに従っていれば、どんなプログラムからでも使うことができます。
(たまたま、CGIが生まれた当時、CGIに適した「テキスト処理」に長けたプログラミング言語としてPerl が主流だったため、CGIといえばPerlという風潮になっただけで、CGIはPerl専用ではありません)

perlcc 元のスクリプトが CGI として動作するPerlプログラムなのであれば、
perlcc が出力した実行プログラムバイナリも CGI として動作します。
    • good
    • 0
この回答へのお礼

テストサーバーではエラーがないのですが、ローカル環境ではライブラリーの読み込み等が不完全な状態でperlcc -B script.plを行って作成されたa.outをテストサーバーにUPして確認していたのが原因だったようです。

仰るとおり、最初、まっさきにa.outをtest.cgiにリネームして確認していたのですが、そもそもローカルで作成したa.outでは、ライブラリーが読み込めていない状態でしたので、その事が原因だったようでした。

ありがとうございました。

お礼日時:2010/03/26 14:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!