【问题标题】:Cannot set parameter using Perl CGI->param()无法使用 Perl CGI->param() 设置参数
【发布时间】:2012-04-25 02:18:29
【问题描述】:

我正在尝试设置要通过 param 函数传递到下一页的参数。

我试过了

param(-name=>'foo',-value=>'the value');
param(-name=>'fooz',-values=>['an','array','of','values']);
param('foo3', 1);

我的脚本重定向到另一个检查所有(参数),但没有运气。 CGI 手册页暗示这应该“正常工作”。我做错了什么?

谢谢!

【问题讨论】:

  • 请描述您遇到的错误,如果有的话。
  • @MichaelSlade 后续页面无论如何都不会收到这些参数
  • +1:我不知道 Perl 支持像 -name 这样的否定裸词。
  • @AdrianPronk 它没有,任何出现在 => 之前的东西都会被隐式引用
  • @JD:这并不完全正确。在我的 Perl (5.10) $x = -name; 中,将 $x 设置为字符串 '-name',但 %x = (+name => 1) 创建一个值为 'name' 的键,而不是 '+name'

标签: perl web cgi


【解决方案1】:

有几种方法可以做到这一点。

  1. 借助 URI::QueryParam 方法构建您的重定向 URI。

    use URI qw();
    use URI::QueryParam qw();
    
    my $q = CGI->new;
    my $u = URI->new($q->url);
    $u->query_param(foo => 'the value');
    $u->query_param_append(fooz => qw(an array of values));
    $u->query_param(foo3 => 1);
    $u->as_string   # expression returns serialised string
    
  2. Save the state 的参数到一个文件,然后从重定向页面加载该文件的状态。

    my $query = CGI->new;
    $query->save(\*FILEHANDLE);
    my $q = CGI->new(\*INFILEHANDLE);
    
  3. 通过 JavaScript 进行重定向,虽然这不会让您更改参数。

    my $q = CGI->new;
    print $q->header();
    print "window.location=\"$url\";\n\n"
    

在我看来,我上面列出的第一个选项是最容易做到的。

【讨论】:

  • 我认为无论是否使用对象都可以传递参数。我正在使用我的 $query = CGI->new; $query->param(-name=>'foo',-value=>'值');打印 $query->redirect(-URL => 'cookietest.cgi' );没有结果。 cookietest.cgi 已读取具有和不具有相同空结果的对象的参数
  • @JD 听起来您正试图在不同的请求上设置参数(通过重定向)。在对象上设置参数将覆盖您当前请求的参数,但它不会通过重定向帮助您处理新请求。尝试 print $query->redirect(-URL => 'cookietest.cgi?foo=bar') 将参数传递给新请求。
  • @JD 我用参数重定向的步骤更新了我的示例。 oalders 所说的就是其中一种选择。
  • 布兰特的回答,连同 oalders 的评论,都恰到好处。如果您需要将键/值对传递到您要重定向到的下一页,则需要实际传递它们。唉,CGI 没有像 Java Servlet 等那样内置会话支持,实际上您必须自己完成工作。 Brant 的第二个选项基本上就是这样做的,但我同意他的观点,你可能应该满足于他的第一个选项。
  • 这些都是很好的建议。我想知道是否有一种方法可以模仿参数传递的表单动作提交方式。你能在 Perl CGI 中做到这一点吗?
【解决方案2】:

您需要使用self_url method

$cgi->param(-name=>'foo',-value=>'the value');
$cgi->param(-name=>'fooz',-values=>['an','array','of','values']);
$cgi->param('foo3', 1);
printf '<a href="%s">next page</a>', $cgi->self_url;

这变成了 f.ex。 &lt;a href="http://localhost:5000/foo.pl?foo=the%20value;fooz=an;fooz=array;fooz=of;fooz=values;foo3=1"&gt;next page&lt;/a&gt;.

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2017-04-12
    • 2012-02-05
    • 1970-01-01
    • 2012-05-05
    • 2013-12-23
    相关资源
    最近更新 更多