我试图从用Perl编写的网页获取用户输入并将其发送到本地程序(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从绝对路径加载,但这不应该是困难的。
编辑:是的,数据库有一个环境变量,已修复。好的,我只需要将输入输入到文件中,将其传递给命令,然后将输出文件打印到CGI页面。
edit2:澄清:
我在$ prot中接收用户输入,我想将它传递给blastp in -query,让程序执行blastp,然后向用户打印results.out文件(或者只是有一个链接到它,因为blastp可以输出HTML)
编辑:
好的,修好了我需要修理的一切。最大的问题是我没有看到出现了什么问题:我不得不安装Tiny:Capture并打印出stderr,当我意识到环境变量没有正确设置时,所以BLAST没有找到我的数据库。谢谢你的帮助!
答案 0 :(得分:0)
将$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");
发送回网络服务器
print $q->p, $out_file_text;
上面的代码存在多个问题(例如,您需要更好的文件/目录路径,更多的错误处理等等),但应该让您在正确的轨道上开始。