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

发布于 2024-12-10 18:35:07 字数 439 浏览 1 评论 0原文

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

浏览器用一些参数调用它。

我想获取这些参数,修改其中一些参数,然后发回带有表示修改后的参数的新查询字符串的重定向。

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

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

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

然而,这只是感觉它可能缺少一些东西。此外,它不执行任何处理多值参数的操作。谁知道它还能做什么。

那么,有没有一个模块可以解决这个问题呢?我对重新发明一个更有才华的工匠制造的轮子不感兴趣。正确的?

I have a perl script using CGI.

The browser calls it with some parameters.

I want to take those parameters, modify some of them and then send back a redirect with a new querystring representing the modified parameters.

I know that I could do this, like this:

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

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

However, this just feels like it might be missing something. In addition, it doesn't do anything to handle multivalued parameters. Who knows what else it fails to do.

So, is there a module out there that just deals with this problem? I'm not interested in reinventing a wheel that a more talented wright wrought. Right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

画离情绘悲伤 2024-12-17 18:35:07

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
     );

The URI module is your friend. It has a query_form method that takes a hash, hashref or arrayref of parameters and generates a query string from it.

It will URL Encode your data for you (and note that you do want it URL Encoded and not HTML Encoded).

So you might have something like:

#!/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
     );
时光暖心i 2024-12-17 18:35:07

您是否看过 Data::URIEncodeURI::QueryParam

Have you looked at Data::URIEncode or URI::QueryParam?

意中人 2024-12-17 18:35:07

事实证明,有一种方法可以仅使用 CGI 模块来满足我的特定需求。然而,其他答案涵盖了更广泛的需求,即序列化任意哈希。

如果您想修改传入参数,然后使用修改后的参数创建指向同一脚本的链接,您可以执行以下操作:

my $params = $cgi->Vars;

$ Modify the values in hash that $params references

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

Turns out, there's a way to achieve my specific need using just the CGI module. However, the other answers cover a wider need, to serialize an arbitrary hash.

If you want to modify incoming parameters and then create a link to the same script with modified parameters you can do this:

my $params = $cgi->Vars;

$ Modify the values in hash that $params references

my $new_url = $cgi->self_url(); # URL with modified parameters
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文