有没有一种巧妙的方法将Perl哈希序列化为HTML查询字符串

Dan*_*umb 1 html perl serialization

我有一个使用CGI的perl脚本.

浏览器使用一些参数调用它.

我想获取这些参数,修改其中一些参数,然后发回一个重定向,其中包含一个代表修改参数的新查询字符串.

我知道我可以这样做,像这样:

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

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

然而,这只是感觉它可能会遗漏一些东西.此外,它没有做任何事情来处理多值参数.谁知道它没有做什么.

那么,是否有一个模块可以处理这个问题?我没有兴趣重新发明一个更有才华的怀疑的车轮.对?

Que*_*tin 9

URI模块是你的朋友.它有一个query_form方法,它接受参数的hash,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
     );
Run Code Online (Sandbox Code Playgroud)