Perlの最適化に取り組む際のa.outについて

このQ&Aのポイント
  • Perlの最適化に取り組む際のa.outについて調査中です。
  • script.plをa.outに変換し、Webからのアクセス時に表示可能にする方法を検討しています。
  • Cソースの生成やコンパイルに関しての知識が必要なようですが、具体的な方法は不明です。
回答を見る
  • ベストアンサー

perlの最適化に取り組む際のa.outについて

perlの最適化に取り組む際のa.outについて 下記IBMのサイトを参考にperlの最適化について取り組んでいます。 http://www.ibm.com/developerworks/jp/linux/library/l-optperl/ 現在、意図している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からアクセス時、表示可能なようにするにはどのようにすれば良いかご教授頂けませんでしょうか

  • taku0
  • お礼率80% (160/199)
  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.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 として動作します。

taku0
質問者

お礼

テストサーバーではエラーがないのですが、ローカル環境ではライブラリーの読み込み等が不完全な状態でperlcc -B script.plを行って作成されたa.outをテストサーバーにUPして確認していたのが原因だったようです。 仰るとおり、最初、まっさきにa.outをtest.cgiにリネームして確認していたのですが、そもそもローカルで作成したa.outでは、ライブラリーが読み込めていない状態でしたので、その事が原因だったようでした。 ありがとうございました。

関連するQ&A

  • Perl ファイルハンドルを閉じずに反映させる

    お世話になっております。 Perl(プログラミング言語)について質問です。 openメソッドで開いたファイルハンドルに print文で書込みを行った際に、ファイルハンドルをcloseせずに、 書込みを反映させる方法はありますか? 開くのはファイルではなく(他プロセスへの)パイプです。 $| を設定してもだめでした (例としては perl1.pl , perl2.pl を用意する <perl1.pl> $i; open(OUT,"| perl2.pl") while(1){ print OUT "$i" $i++  } close(OUT) <perl2.pl> while( <STDIN> ) { print $_; } のようなことをやりたいです。 上記のようなスクリプトを実行したところ、 perl1のcloseが実行されるまで反映されません。 これをcloseをせずに反映させる方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl:ファイルハンドルをスカラー変数にすると変

    お世話になります。 Perlの書き方について教えてください。 Perlのファイルハンドルで、昔はINやOUTやFILEのようにベアワード(裸のワード)を使っていたと思います。 ★(プログラム1) #! /bin/perl # # fh_bareword.pl use strict; use warnings; open IN, '<', 'in.txt'; open OUT, '>', 'out.txt'; while (<IN>) { print OUT; } close IN; close OUT; ★(実行例) C:\Perl\perl>type in.txt This is a pen. That is a book. C:\Perl\perl>fh_bareword.pl C:\Perl\perl>type out.txt This is a pen. That is a book. ★★★ ところが、これだとIN、OUTがグローバル名になってしまい、他のモジュールと衝突することがあるということで、myつきのスカラー変数にした方が良いと言われました。 それで、以下のように書いてみましたが、想定のように動作しません。 ★(プログラム2) #! /bin/perl # # fh_scalar.pl use strict; use warnings; open my $in, '<', 'in.txt'; open my $out, '>', 'out.txt'; while (<$in>) { print $out; } close $in; close $out; ★(実行例) C:\Perl\perl>fh_scalar.pl GLOB(0x146ea34)GLOB(0x146ea34) C:\Perl\perl>dir out.txt ドライブ C のボリューム ラベルは eMachines です ボリューム シリアル番号は 89C9-F870 です C:\Perl\perl のディレクトリ 2013/07/09 23:05 0 out.txt 1 個のファイル 0 バイト 0 個のディレクトリ 23,226,032,128 バイトの空き領域 ★★★ たぶん print $out; の部分で、私はファイルハンドル$outに$_を表示してくださいと意図していたのですが、「ファイルハンドルSTDOUTに$outを表示してください」という意図に受け取られたらしく、上記のようにGLOBのリファレンス?が表示されてしまいました。 print $out $_; と書くと、確かに正しく表示されますが、これが正しい書き方なのでしょうか。 printの後ろに来るのは出力する文字列ではなくファイルハンドルだと、正しく判断してもらえるもっと美しい書き方はあるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • @niftyホームページでのアクセスカウンタ(perl)

    すごく簡単なアクセスカウンタなのですが実行できません。 ちなみに、perlスクリプトは、count.plというファイルに、 #!/usr/local/bin/perl $countfile="count.dat"; open IN,"$countfile"; $count=<IN>; close IN; $count=$count+1; open OUT,">$countfile"; print OUT $count; close OUT; print $count; html内の記述は、 あなたは、<!--#exec cmd="http://hpcgi3.nifty.com/******/count.pl"-->人目 plファイルを置くディレクトリは間違っていないようです。 perl、@niftyに詳しい方回答お願い致します。

    • ベストアンサー
    • Perl
  • perl2exeでuse encodingが使えない

    下記のようなスクリプトを作成しました。 スクリプト名は test_kanji.pl ---------------- use encoding("shift-jis"); print "表現\n"; ----------------- 上記を実行すると、正しく”表現”の文字が表示されます。 これをperl2exeで実行形式に変換すると 下記のエラーが表示され、期待した結果が得られません。 Converting 'test_kanji.pl' to test_kanji.exe Warning: Can't locate I18N/Langinfo.pm at C:\Perl\lib\encoding.pm line 41 @INC = c:\perl\userlib, C:\Perl\lib, C:\Perl\site\lib, . 又、強引にtest_kanji.exeを実行すると encoding: Unknown encoding 'shift-jis' at C:\Perl\userlib\test_kanji.exe line 1 BEGIN failed--compilation aborted at C:\Perl\userlib\test_kanji.exe line 1. のようなメッセージが表示され、”表現”が表示されません。 perl2exeでuse encodingは使用できないのでしょうか。

  • [perl5.8] SJISから読み込んだ~と

    sjisで書かれたファイルsjis.txtに"~"と一文字だけ 書いて、それをutf8で記述した以下のperlスクリプト で読込み、文字列マッチングをしたのですが、うまく いきません。(ちなみにソース中blockB部分を有効に し、blockAをコメントアウトするとうまくいきます) #=== match.pl =============================== #!/usr/bin/perl use encoding 'utf8'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(utf8)"; binmode STDOUT, ":raw:encoding(shiftjis)"; # === blockA === open(IN, "<sjis.txt"); @lines = <IN>; close(IN); # ============== # === blockB === # $a = "~"; # push(@lines, $a); # ============== for(@lines) {  if (/~/) {   print "WAVEDASH発見\n";  } } #============================================= ※いわゆるWAVEDASH問題に起因してそうだな、  というのはわかりますが、具体的に何が起きて  いるのかが理解できません。 原因や、どうすればこの問題を解決できるか、 ご存知の方、お知恵をお貸しください。

    • ベストアンサー
    • Perl
  • perlでcsvファイルから複数行を抽出したい

    プログラミング初心者です。 お知恵をお貸しください。 perlでcsvファイルから任意の複数行を、コマンドライン引数を使って抜き出したいです。 1行だけだとうまくいきますが、以下ではすべてのcsvデータが出力されてしまいます。 ----------------------getcsv.pl ここから---------------------- #!/usr/bin/perl -- use strict; use warnings; open(IN, "<adata.csv"); open (OUT, ">$bdata.csv"); while(<IN>){ if($. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]) { print OUT $_; } } close(IN); close (OUT); ----------------------getcsv.pl ここまで---------------------- ----------------------コマンド ここから---------------------- perl getcsv.pl 1 3 8 10 ----------------------コマンド ここまで---------------------- よろしくお願いします。

    • ベストアンサー
    • Perl
  • cronでのPerlスクリプト実行

    少し前に同様の質問をしましたが、やはり解決していませんでした。 #!/usr/bin/perl open(OUT,">/home/test/test.log"); print OUT "OK"; close(OUT); このスクリプトをcrontabに以下のように記述しました。 0 0 * * * /home/test/test.pl > /dev/null 2>&1 パーミッションは省略します。 このようにすると、正常にtest.logが出力されました。 しかし、本当に実行したいスクリプトを同様にしたところ、 正常に動作しませんでした。cronログには記録されます。 実際のスクリプトは長いのでここには掲載できませんが、 主な処理はおおよそ次のようなことをしています。 ・pmとplモジュールがあり、plからpmを呼び出している。 ・plもpmも自作のユーザ関数の組み合わせ ・ファイルはtestユーザが所有し、実行権限は777。  (動作確認後、徐々に落としていきます) ・plでは、use encoding 'utf8'。 ・スクリプトにオプションを付けて、引数を読み込む。 ・loggerでsyslogへ結果を出力。 ・子プロセスを生成して処理の一端を行わせている。 ・opendir、readdirなどを使用。 ・xxxxxx.datファイルを読み書きしている。 ・CPANにあったメール送受信モジュールを使用している。 ・ファイルをbz2圧縮している。 などです。 コマンドラインから実行すると確実に正常に動作します。 気になるのはPerlスクリプトの内容でモジュールを使うときは、 パスが通っていてもフルパス指定しないといけないのでしょうか? しかし、フルパスと言ってもせいぜいsystem()で実行するコマンドを フルパスにするくらいしか思いつきません。 うまく実行できない理由として考えられる可能性があることを 教えてもらえませんか? 根本的な解決としては、cronでの実行とコマンドラインからの実行は 何が違うのかが明確になれば対処できるのかもしれません。 よろしくお願いします。

  • Perlで参照のクリアの方法

    Perlで参照のクリアで困っているのですが、以下のソースで正しくクリア方法はありますか? use strict; use warnings; use Data::Dumper; sub test { my ($arrayref) = @_; $$arrayref[2]{'A'} = 'aaaaa'; #$$arrayref = (); # Not a SCALAR reference at test_0042.pl line 10. $arrayref = (); #←クリアしているが、Dumperするとクリアされていない } my @A = (); print Dumper(@A); print "\n"; test(\@A); print Dumper(@A); print "\n"; exit; __END__ $VAR1 = undef; $VAR2 = undef; $VAR3 = { 'A' => 'aaaaa' };

    • ベストアンサー
    • Perl
  • [perl5.8] SJISで出力したはずのファイルにutf8フラグが

    1)SJISで以下の2行を含むファイルを作成し、   sjis.txtという名前で保存します。 "ホツカイドウ" "北海道" 2)SJISで以下のスクリプトを作成します。 #=== one.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis.txt'; my $outfile = 'sjis2.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print OU @lines; close(OU); 3)SJIJSで以下のスクリプトを作成します #=== two.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis2.txt'; my $outfile = 'sjis3.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print @lines; close(OU); 4)one.pl を実行し、続いてtwo.plを実行すると 以下のエラーがコマンドプロンプトに表示されます。 #------------------------------------------- D:\zipcode\utf8mondai>two.pl Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "・趣セゑスカ・イ・・セ橸スウ" Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "蛹玲オキ驕・ これは何故なのでしょうか。 エラーメッセージは、printしようとしている 文字列にutf8フラグがついているという意味 らしいです。

    • ベストアンサー
    • Perl
  • ActivePerl-5.10.0.1004の日本語対応にする方法

    超初心者の質問ですみません。 今、Perlの絵本でActivePerlの勉強中ですが use encording"shiftjis"; $a=1; print "はじめは$aでした。\n"; $a=++; print "1増えて$aになりました。\n"; $a=--; print "1減って$aに戻りました。\n"; を実行しても、 Can't locate encording.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib . ) at hello8.pl line 1. BEGIN failed--compilation aborted at hello8.pl line 1. と表示されます。 解消法を教えてください。