2012-06-18 41 views
5

Tôi đang cố gắng tùy chỉnh tập lệnh và cần nhận giá trị POST từ biểu mẫu sử dụng perl. Tôi không có nền tảng của perl nhưng đây là một điều khá đơn giản vì vậy tôi đoán nó không phải là khó khăn.cách nhận giá trị POST trong perl

Đây là phiên bản php của mã Tôi muốn có trong PERL:

<?php 
$download = ($_POST['dl']) ? '1' : '0'; 
?> 

Tôi biết điều này không thể được ở tất cả liên quan đến phiên bản PERL nhưng nó có thể giúp tôi đoán làm rõ chính xác những gì tôi đang tìm cách làm.

+0

Bạn có thể giải thích thêm một chút không? – vijay

+2

@vjshah Im không chắc chắn nếu bạn đang được châm biếm, nhưng chắc chắn, tôi chỉ cần biết làm thế nào để có được giá trị POST (từ một mẫu đệ trình) và gán nó cho một biến. –

Trả lời

6

Vâng, trong trường hợp đó xin vui lòng có một cái nhìn tại mã đơn giản này: Điều này sẽ giúp bạn: lời khuyên

#!/usr/bin/perl 
use strict; 
use warnings; 
use CGI; 
use CGI::Carp qw(fatalsToBrowser); 

sub output_top($); 
sub output_end($); 
sub display_results($); 
sub output_form($); 

my $q = new CGI; 

print $q->header(); 

# Output stylesheet, heading etc 
output_top($q); 

if ($q->param()) { 
    # Parameters are defined, therefore the form has been submitted 
    display_results($q); 
} else { 
    # We're here for the first time, display the form 
    output_form($q); 
} 

# Output footer and end html 
output_end($q); 

exit 0; 

# Outputs the start html tag, stylesheet and heading 
sub output_top($) { 
    my ($q) = @_; 
    print $q->start_html(
     -title => 'A Questionaire', 
     -bgcolor => 'white'); 
} 

# Outputs a footer line and end html tags 
sub output_end($) { 
    my ($q) = @_; 
    print $q->div("My Web Form"); 
    print $q->end_html; 
} 

# Displays the results of the form 
sub display_results($) { 
    my ($q) = @_; 

    my $username = $q->param('user_name'); 
} 

# Outputs a web form 
sub output_form($) { 
    my ($q) = @_; 
    print $q->start_form(
     -name => 'main', 
     -method => 'POST', 
    ); 

    print $q->start_table; 
    print $q->Tr(
     $q->td('Name:'), 
     $q->td(
     $q->textfield(-name => "user_name", -size => 50) 
    ) 
    ); 

    print $q->Tr(
     $q->td($q->submit(-value => 'Submit')), 
     $q->td('&nbsp;') 
    ); 
    print $q->end_table; 
    print $q->end_form; 
} 
+0

Đây là một ví dụ khá hay, và tôi nghĩ tôi hiểu, nhưng kịch bản hiện tại tôi đang sử dụng sử dụng các giá trị GET/POST NHƯNG không bao gồm 'CGI' mới, có cách nào khác để làm điều này không? –

+1

Trong trường hợp đó, một phương pháp có thể được sử dụng jQuery để xử lý bài viết. Và bạn luôn có thể bao gồm mã javascript để perl. in qq (#bao gồm các tiêu đề jQuery ('form_id'). submit (function() {var val = jQuery ("id"). val();})); – vijay

+0

thats perfect :) Tôi không nghĩ đến việc sử dụng jquery. cảm ơn –

0

Đây là một nơi tốt để bắt đầu: The Fool's Guide to CGI.pm, the Perl module for CGI scripting.

Điều này sẽ cho bạn thấy "... cách nhận giá trị POST (từ biểu mẫu đã gửi) và gán giá trị đó cho biến".

Hy vọng điều này sẽ hữu ích!

+0

Tôi quét qua nó và thấy rằng bạn có thể làm 'param ('mẫu')' bây giờ một cái gì đó mà tôi couldnt tìm thấy là làm thế nào để phân biệt giữa GET và POST yêu cầu ?? Tôi không muốn nhận giá trị 'GET', CHỈ nếu' POST' được đặt giá trị sẽ được gán cho $ download –

+0

$ ENV {'REQUEST_METHOD'} = ~ tr/a-z/A-Z /; nếu ($ ENV {'REQUEST_METHOD'} eq "POST") {#do something here;} – d5e5

+2

Bạn có thể sử dụng 'request_method()' của CGI.pm' để kiểm tra yêu cầu 'POST', ví dụ: 'my $ requestMethod = $ cgi-> request_method()'. – Kenosis

4

Kiểu: bạn hầu như không bao giờ cần phải gán 0 hoặc 1 cho một biến. Đơn giản chỉ cần đánh giá giá trị chính nó trong bối cảnh bool.


Trong CGI.pm (CGI), phương pháp param kết hợp POST và GET thông số, vì vậy chúng ta cần phải kiểm tra phương thức yêu cầu riêng:

#!/usr/bin/env perl 
use strict; 
use warnings FATAL => 'all'; 
use CGI qw(); 
my $c = CGI->new; 
print $c->header('text/plain'); 
if ('POST' eq $c->request_method && $c->param('dl')) { 
    # yes, parameter exists 
} else { 
    # no 
} 
print 'Do not taunt happy fun CGI.'; 

Với Plack::Request (PSGI), bạn có phương pháp khác nhau cho POST (body_parameters) và GET (query_parameters) ngoài giao diện hỗn hợp (parameters):

#!/usr/bin/env plackup 
use strict; 
use warnings FATAL => 'all'; 
use Plack::Request qw(); 
my $app = sub { 
    my ($env) = @_; 
    my $req = Plack::Request->new($env); 
    if ($req->body_parameters->get_all('dl')) { 
     # yes 
    } else { 
     # no 
    } 
    return [200, [Content_Type => 'text/plain'], ['Do not taunt happy fun Plack.']]; 
}; 
0

Các ví dụ trên hơi phức tạp. Mã dưới đây đọc các giá trị POST thành một biến. Bạn có thể trích xuất Key Value từ đó. Nếu GET của nó thì tốt hơn là sử dụng mô-đun CGI.

#!/usr/bin/perl 

my $FormData = ''; 
read(STDIN, $FormData, $ENV{'CONTENT_LENGTH'}); 

## Variable $FormData holds all POST values passed 

use CGI; 
my $cgi = new CGI; 
print $cgi->header(); 
print "$FormData"; 
Các vấn đề liên quan