2017-06-13 11 views
-3

我有一個學校的作業。我們需要使用POST方法將數據從嵌入式HTML表單傳遞給Perl腳本。然後Perl將遍歷數據並將其顯示回給用戶。方法是POST時如何使用嵌入式HTML表單數據?

我正在使用一個單獨的文件和GET方法,但我的老師說我必須嵌入HTML並使用POST。但信息不再存儲在環境變量中。

是否有一個內置變量可以用來訪問這些信息?

#!/usr/bin/perl -w 

print "Content-Type:text/html\n\n"; 

$qstring = $ENV{'QUERY_STRING'}; 
$rmethod = $ENV{'REQUEST_METHOD'}; 

if ($rmethod eq "GET") { 
    &displayform(); 
} 
elsif ($rmethod eq "POST") { 

    @pairs = split(/&/, $qstring); 

    foreach (@pairs) { 
     ($key, $value) = split(/=/); 
     $value =~ tr/+/ /; 
     $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 
     $form{$key} = $value; 
    } 

    print "<html><head><title>Student Survey</title></head>\n"; 
    print "<body>\n"; 

    &displayInfo(); 

    print "</body></html>\n"; 
} 

print "</body></html>\n"; 
} 

sub displayInfo { 
    print "Full Name:",  $form{"person"}, "<br>"; 
    print "Favourite:",  $form{"sport"}, "<br>"; 
    print "Favourite Course:", $form{"course"}, "<br>"; 
    print "GPA:",    $form{"gpa"}, "<br>"; 
} 

sub displayform { 
    print qq~ (FORM GOES HERE) 
+2

考慮到這是一個學校作業,你將需要顯示大量的努力。你可以請更新你的問題,以顯示[**你已經嘗試**](http://meta.stackoverflow.com/questions/261592)關於新方法,展示你面臨的具體問題[**最小,完整和可驗證的示例**](http://stackoverflow.com/help/mcve)。 –

+0

我的問題我相信居住在環境變量,因爲測試我一直沒有找到一種方法來拉表單元素。編輯到目前爲止顯示我的劇本。 –

+1

使用[CGI :: Simple](https://metacpan.org/pod/CGI::Simple)代替20世紀最後十年的貨物編碼。另外,如果這是他們教你的,請索取退款。 –

回答

3

有人教你非常不好的做法。我不知道您的示例代碼是否遵循學校提供的示例,或者您是否已經通過互聯網上的不良示例將它拼湊在一起 - 但無論哪種方式,此代碼使用的技術已過時二十年。

關於2017年教授CGI編程的智慧有一個全面的辯論(請參閱CGI::Alternatives簡要討論一些更好的方法),但讓我們忽略它,並假設CGI在這裏是一個好主意。

如果您正在編寫一個CGI程序,那麼您應該使用CGI.pm庫,它已經是標準Perl發行版的一部分超過二十年了(最近它已被刪除,但您的學校使用此版本的機會迄今爲止很小)。

一個標準的CGI程序,使用CGI.pm看起來是這樣的:

#!/user/bin/env perl 

use strict; 
use warnings; 
use CGI qw[header param]; # Load the two functions we're going to use 

# Display the content-type header 
print header; 

# See if we have been passed parameters. 
if (param) { 
    # Display the parameters 
    # Note: I've ignored HTML here. You shouldn't 
    print 'Name: ', param('person'); 
    print 'Sport: ', param('sport'); 
    # etc... 
} else { 
    # Display the form 
    ... 
} 

我忽略HTML在我的例子,因爲在你的Perl代碼中嵌入HTML是一個可怕的想法。使用模板系統是一個更好的主意(我建議使用Template Toolkit)。

其他一些要點:

  • 始終use strictuse warnings
  • 的家當-wuse warnings於2000年
  • 使用在子程序調用&廢棄已沒有必要,因爲Perl 5的1994年

發佈我知道你不知道任何更好,你只是跟隨你的老師告訴你要做的事情。但看到這種過時的做法在學校教授真是令人沮喪。

更新:只是爲您的原始問題添加答案。你是對的,在POST請求中,參數數據在QUERY_STRING環境變量中不再可用 - 您需要改爲從STDIN讀取它。這是CGI.pm的許多優點之一 - 您使用相同的方法(param()子例程)來訪問GET和POST參數。

+0

謝謝,我已經完成了很久以前的任務,並且按照您所展示的確切方式構建了它。 是的,課程是基於15年以上的教授編寫的,從未改變任何內容。 –

相關問題