Есть ли удобный способ сериализации Perl-хэша в строку HTML-запроса - PullRequest
1 голос
/ 20 октября 2011

У меня есть Perl-скрипт, использующий CGI.

Браузер вызывает его с некоторыми параметрами.

Я хочу взять эти параметры, изменить некоторые из них и затем отправить обратно перенаправление сновая строка запроса, представляющая измененные параметры.

Я знаю, что я мог бы сделать это, например:

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

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

Однако, похоже, что что-то упущено.Кроме того, он ничего не делает для обработки многозначных параметров.Кто знает, что еще он не может сделать.

Итак, есть ли модуль, который занимается только этой проблемой?Я не заинтересован в том, чтобы заново изобретать колесо, которое сделал более талантливый Райт.Правильно?

Ответы [ 3 ]

9 голосов
/ 20 октября 2011

Модуль URI - ваш друг.У него есть метод query_form, который принимает хеш, hashref или arrayref параметров и генерирует из него строку запроса.

Он будет кодировать ваши данные по URL (и учтите, что вы хотите, чтобы они были закодированы и не HTML Encoded).

Таким образом, вы можете получить что-то вроде:

#!/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
     );
2 голосов
/ 20 октября 2011

Оказывается, есть способ удовлетворить мою конкретную потребность, используя только модуль CGI. Однако другие ответы охватывают более широкую потребность в сериализации произвольного хэша.

Если вы хотите изменить входящие параметры, а затем создать ссылку на тот же скрипт с измененными параметрами, вы можете сделать это:

my $params = $cgi->Vars;

$ Modify the values in hash that $params references

my $new_url = $cgi->self_url(); # URL with modified parameters
2 голосов
/ 20 октября 2011

Вы смотрели на Данные :: URIEncode или URI :: QueryParam ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...