如何在Perl中使用用户输入运行本地程序

时间:2014-05-24 13:43:45

标签: perl cgi

我试图从用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没有找到我的数据库。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

  1. $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. 步骤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. 步骤3:读取输出文件:

    use File::Slurp;
    my $out_file_text = read_file("results.out");
    
  4. 发送回网络服务器

    print $q->p, $out_file_text;
    
  5. 上面的代码存在多个问题(例如,您需要更好的文件/目录路径,更多的错误处理等等),但应该让您在正确的轨道上开始。