2011-10-20 1 views
1

CGI를 사용하는 perl 스크립트가 있습니다.Perl 해시를 HTML 쿼리 문자열로 serialize하는 깔끔한 방법이 있습니까?

브라우저는 일부 매개 변수를 사용하여 브라우저를 호출합니다.

필자는 이러한 매개 변수를 가져 와서 일부 매개 변수를 수정 한 다음 수정 된 매개 변수를 나타내는 새 쿼리 문자열을 사용하여 리디렉션을 다시 보내려고합니다.

은 내가 이런 식으로,이 작업을 수행 할 수 있다는 것을 알고 뭔가를 누락 될 수 있습니다처럼

my $cgi = CGI->new() 
my %vars = $cgi->Vars 
$vars{'modify_me'} .=' more stuff'; 

my $serialized = join '&', map {$_.'='.$cgi->escapeHTML($vars{$_})} keys %vars; 

그러나 이것은 단지 느낀다. 또한 다중 값 매개 변수를 처리하기 위해 어떤 작업도 수행하지 않습니다. 그 밖에 무엇이 실패했는지 알 수 있습니다.

그래서이 문제를 해결하는 모듈이 있습니까? 나는 더 재능있는 라이트가 만든 바퀴를 다시 발명하는 것에는 관심이 없다. 권리?

+0

오, 그래 ...이 목적을 달성하기 위해 단지 더 좋은 방법이 있다면, 나는 그것에 열려있다. – Dancrumb

답변

9

URI module은 (는) 친구입니다. 그것은 query_form 해시, hashref 또는 매개 변수의 arrayref를 취하여 그로부터 쿼리 문자열을 생성합니다.

URL을 인코딩하고 URL 인코딩을 사용하고 이 아닌 HTML 인코딩을 사용합니다.

#!/usr/bin/perl 

use strict; 
use warnings; 
use CGI; 
use URI; 

my $q = CGI->new; 

my @data = map { 
     my $name = $_; 
     my @values = $q->param($name); 
     my $value; 
     if (scalar @values == 1) { 
      ($value) = @values; 
     } else { 
      $value = \@values; 
     } 

     if ($name eq "foo") { 
      $value = "replaced"; 
     } 
     ($name, $value); 
    } $q->param; 

my $uri = URI->new('http://example.com/myAlternative.cgi'); 
$uri->query_form(\@data); 

print $q->redirect(
    -uri=> $uri, 
    -status => 301 
    ); 
+0

이것은 잘못되었습니다. query_form은 공백을 URL에 대해 유효하지 않은 '+'(plusses)로 변환합니다. % 20이어야합니다. 입력 : $ uri-> query_form ([ 'foo bar'=> 1]); 출력 : http://example.com/myAlternative.cgi?foo+bar=1 –

+0

@AndyRay -'+'는 URL에 대해 유효하지 않습니다. 그것이 정규 HTML 폼을 제출할 때 입력하는 공백은'+'문자로 변환됩니다. – Quentin

+0

나는 이해하지만, 어떤 공간에서는 유효하지 않다. 공간은 % 20입니다. 공백으로 URL을 인코딩하면 URL의 데이터가 바뀌므로 공백이있는 URL을 올바르게 인코딩 할 수 없습니다. –

2

밝혀지면 CGI 모듈을 사용하여 구체적인 필요를 충족시킬 수있는 방법이 있습니다. 그러나 다른 답변은 임의의 해시를 직렬화하는 데 더 넓은 필요를 충족합니다.

들어오는 매개 변수를 수정 한 다음이 작업을 수행 할 수 있습니다 수정 매개 변수를 사용하여 동일한 스크립트에 대한 링크를 만들려면 :

my $params = $cgi->Vars; 

$ Modify the values in hash that $params references 

my $new_url = $cgi->self_url(); # URL with modified parameters 
관련 문제