【问题标题】:html and perl, returning script text instead of runninghtml 和 perl,返回脚本文本而不是运行
【发布时间】:2012-01-05 05:58:37
【问题描述】:

我一直在写一个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!”

【问题讨论】:

标签: javascript html perl


【解决方案1】:

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

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

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

希望这会有所帮助。

【讨论】:

  • 谢谢,你这么解释听起来很简单!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    正如其他人所提到的,您需要某种服务器来充当浏览器和 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 标记的需要)。我希望在本月内发布此更新(一旦我可以让我的新异步持续传递服务器重写工作而不会崩溃:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多