HTML和perl,返回脚本文本而不是运行



我一直在写一个html界面显示表格,饼图,数据等。

生成数据和表的Perl脚本可以在终端上通过一个命令调用,我想在html中有一个按钮来调用它。我不真的需要Perl脚本在运行后的任何反馈,尽管如果它能返回"一切都比预期的要好",那就太好了。

然而,目前,每次我点击提交,我被要求打开或保存Perl脚本,经过一天的谷歌搜索,我无法修复它,将感谢一些建议。

我是html和js的新手,但这是我到目前为止所拥有的:

<form action="scripts/do_processing.pl" method="get">
<table>
<td>Select input file: (must be fasta format)</td>
<td>
<input type="file" name="first_name" value="" maxlength="100" />
</td>
</tr>
<br>
<tr>
<tr><td>Binning:</td>
<td>
<input type="radio" name="bin_method" value="blastn" /> Blastn
<input type="radio" name="bin_method" value="blastx" /> Blastx
<input type="radio" name="bin_method" value="megan" /> Megan
</td>
</tr>
</table>
<br><br>
<input  TYPE=IMAGE 
        SRC="images/go_button-green.jpg" 
        HEIGHT=100 WIDTH=auto
        ALT="Go!" BORDER=0 
        NAME="go"
        >
</td>
</tr>
</form><br>

它只能在本地运行,我无意让外部世界访问它,因此避免CGI和apache式的解决方案,我认为这是不必要的。链接都很好,因为它每次都试图打开文件。

注意:目前输入是不相关的,因为我目前试图调用的perl脚本只是一个"Hello World!"

不幸的是,您需要使用web服务器。

在你的情况下,当你打开本地HTML文件,当你点击表单时,浏览器看"地址"的行动,基于web页面在哪里,因为你是本地的,你的网页是一个文件://url,所以基本上趋于perl文件(这是你想要的),除了浏览器本身简单请求的文件从您的文件系统,不知道如何处理它,文件系统不运行perl脚本,它只是简单地提供该文件。因此,唯一可能的回应就是让你下载它。

在web服务的上下文中,当你告诉服务器"转到这个perl文件"并且假设web服务器配置正确时,web服务器注意到.pl是一个特殊的文件,它必须运行它,所以它这样做,然后获取它的输出并将其发送给你的浏览器。这就是你想要做的。

为了在承载HTML页面的机器上发生一些事情,您需要有某种进程在端口80上查找到该机器的请求。在所有情况下,这将是某种"web服务器",因为端口80是标准的"web"端口。

您可以编写自己的简单服务器来侦听请求并运行脚本,但我建议使用现有的轻量级且易于设置的服务器。

另一个选择是在不同的端口做同样的事情(有一个侦听器)。

正如其他人提到的,您需要某种服务器充当浏览器和perl之间的粘合剂。我写的一个模块(Web::Gui)可以作为粘合剂,同时为您编写所有的HTML和JavaScript:

use Web::Gui;
display(
    TABLE(
        TR(
            TD('Select input file: (must be fasta format)'),
            TD(INPUT type=>"file", id=>"first_name", maxlength=>100)
        ),
        TR(
            TD('Binning:'),
            TD(map BinMethod($_), qw(Blastn Blastx Megan)),
        ),
        TR(TD(colspan => 2,
            INPUT(type=>'button', value=>'Go', onclick=>sub {
                print "running appn";
                print "file: ", ID(first_name)->value, $/;
                my $radios = gui('document')->getElementsByName('bin_method');
                my @values = map {$_->value} grep {$_->checked} @$radios;
                print "bin: @valuesn";
            })
        ))
    )
);
sub BinMethod {
    INPUT(type=>"radio", name=>"bin_method", value=>lc $_[0]),
    SPAN($_[0])
}

Web::Gui不是完美的(也没有完成),但它可能很适合您的问题。XUL::Gui (Web::Gui是其中的一部分)的主要更新即将到期。它将通过jQuery支持、jQueryUI和一些改进的语法来增强Web::Gui(除其他外,在上面的示例中消除了对SPAN标记的需要)。我希望有这个更新张贴在一个月内(只要我能得到我的新的异步延续传递服务器重写工作没有崩溃:)

最新更新