2012-01-04 52 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。我希望在本月內發佈此更新(只要我可以讓我的新異步續傳文件服務器重寫工作而不崩潰:)