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

时间:2012-01-04 17:12:57

标签: javascript html perl

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

生成数据和表的Perl脚本可以通过终端上的单个命令调用,我希望在html中有一个按钮来调用它。我不会真的需要来自Perl脚本的任何反馈,尽管如果它可以ping回“一切都比预期更好”,那就太好了。

目前,每次点击提交时,我都会被要求打开或保存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-esque解决方案。链接都很好,因为它每次都试图打开文件。

注意:此时输入不相关,因为我正在尝试调用的perl脚本只是一个“Hello World!”

3 个答案:

答案 0 :(得分:4)

对于您正在做的事情,您不幸地需要使用Web服务器。

在您的情况下,当您在本地打开HTML文件时,当您单击表单时,浏览器会查看操作并根据您的网页的位置转到该“地址”,因为您是本地的,您的网页是一个文件:// url,所以它基本上是你的perl文件(这是你想要的),除了浏览器本身只是从你的文件系统请求文件,不知道如何处理它,文件系统不运行你的perl脚本,它只是提供文件。因此,只有可靠的回复才能让您下载它。

在Web服务的上下文中,当您告诉服务器“转到此perl文件”并假设Web服务器配置正确时,Web服务器会注意到.pl是一个特殊文件,它必须运行它,它确实如此,然后抓取它的输出并将其发送到您的浏览器。这是你想要做的。

希望这有帮助。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

正如其他人所提到的,你需要某种服务器作为浏览器和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 app\n";
                print "file: ", ID(first_name)->value, $/;

                my $radios = gui('document')->getElementsByName('bin_method');
                my @values = map {$_->value} grep {$_->checked} @$radios;
                print "bin: @values\n";
            })
        ))
    )
);

sub BinMethod {
    INPUT(type=>"radio", name=>"bin_method", value=>lc $_[0]),
    SPAN($_[0])
}

Web::Gui并不完美(也没有完成),但它可能非常适合您的问题。 XUL::Gui(其中Web::Gui是其中一部分)的重大更新即将发布。它将通过jQuery支持,jQueryUI和一些改进的语法来增强Web::Gui(除了上述示例之外不需要SPAN标记)。我希望在这个月内发布这个更新(一旦我可以让我的新异步延续传递服务器重写工作而不会崩溃:)