2012-01-04 51 views
0

我一直在写一个HTML界面,用于显示表,饼图,数据等HTML和perl,返回脚本文本代替运行

产生的数据和表格的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!”。

+0

当您说“本地运行”时,您的意思是指点击在链接上运行他们的计算机上的脚本 - 服务器不运行脚本? – 2012-01-04 17:15:59

+3

你使用某种网络服务器?即使像[starman](http://p3rl.org/starman)或[plackup](http://p3rl.org/plackup)或[Starlet](http://p3rl.org/Starlet)或真的任何[PSGI服务器](http://metacpan.org/search?q=psgi+server)。 – 2012-01-04 17:24:29

+0

真的,你应该看看[舞者](http://perldancer.org)[Mojolicious](http://mojolicio.us)[Catalyst](http://catalystframework.org)或[梅森](http: //masonhq.com)。它们都将运行在[PSGI兼容的服务器]上(http://metacpan.org/search?q=psgi+server)。 – 2012-01-04 18:26:00

回答

4

对于你在做什么,不幸的是你需要使用网络服务器。

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

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

希望这会有所帮助。

+0

谢谢,当你这样解释时,听起来很简单! – Daniel 2012-01-17 17:34:12

1

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

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

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

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和一些改进的语法(在上面的示例中不再需要SPAN标记)来增强Web::Gui。我希望在本月内发布此更新(只要我可以让我的新异步续传文件服务器重写工作而不崩溃:)