Perlで書かれたWebページからユーザー入力を取得してローカルプログラム(blastp)に送信し、結果を表示しようとしています。
これは私が今持っているものです:
(input code)
print $q->p, "Your database: $bd",
$q->p, "Your protein is: $prot",
$q->p, "Executing...";
print $q->p, system("blastp","-db $bd","-query $prot","-out results.out");
今、私は少し調査をしましたが、Perlでこのようなことをどのように行うべきかを完全に理解することはできません。ファイルを開いて書き込み、入力としてblastpに送信しようとしましたが、失敗しました。
参考までに、この行は正常な出力ファイルを生成します。
kold@sazabi ~/BLAST/pataa $ blastp -db pataa -query ../teste.fs -out results.out
bdを絶対パスから強制的にロードする必要があるかもしれませんが、それは難しいことではありません。
編集:ええ、DBには環境変数がありますが、それは修正されています。必要なのは、入力をファイルに取得し、それをコマンドに渡してから、出力ファイルをCGIページに出力することだけです。
edit2:明確にするために:
$ protでユーザー入力を受け取っています。これを-queryでblastpに渡し、プログラムblastpを実行してから、results.outファイルをユーザーに出力します(またはblastp以降、このファイルへのリンクを用意します。 HTMLで出力できます)
編集:
了解しました。修正する必要があるすべてを修正しました。大きな問題は、何が問題になっているのかわからないことでした。Tiny:Captureをインストールしてstderrを印刷する必要がありました。これは、環境変数が正しく設定されていないことに気付いたため、BLASTがデータベースを見つけられなかったためです。すべての助けをありがとう!
$prot
ファイルに書き込みます。テキストを分割するためにテキストを処理せずに、そのまま実行する必要があると仮定します。
固定ファイル名の場合(問題がある可能性があります):
use File::Slurp;
write_file("../teste.fs", $prot, "\n") or print_error_to_web();
# Implement the latter to print error in nice HTML format
一時ファイルの場合(より良い):
my ($fh, $filename) = tempfile( $template, DIR => "..", CLEANUP => 1);
# You can also create temp directory which is even better, via tempdir()
print $fh "$prot\n";
close $fh;
ステップ2:指示どおりにコマンドを実行します。
my $rc = system("$BLASTP_PATH/blastp", "-db", "pataa"
,"-query", "../teste.fs", "-out", "results.out");
# Process $rc for errors
# Use qx[] instead of system() if you want to capture
# standard output of the command
ステップ3:出力ファイルを次の場所で読み取ります。
use File::Slurp;
my $out_file_text = read_file("results.out");
Webサーバーに送り返す
print $q->p, $out_file_text;
上記のコードには複数の問題があります(たとえば、より良いファイル/ディレクトリパス、より多くのエラー処理などが必要です...)が、正しい方向に進む必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加