【问题标题】:HTML Query String into Perl Hash?将 HTML 查询字符串转换为 Perl 哈希?
【发布时间】:2020-01-02 13:10:54
【问题描述】:

通常我只需要在网页之间传递少量值。为了检索它们,我一个接一个地输入了我知道会在查询字符串中的值。比如……

my $var = param('input');

我会根据需要重复多次...这很少很多。

但是,我发现自己处于必须传递很多值的情况。为了使事情更有趣,我不会确切知道有多少变量或将传递哪些变量。确实,可能性来自有限的集合,但要一个一个地完成它们将是一件苦差事。如果能够在网页之间传递散列,其效率与我们在函数之间传递散列的效率相同,那就太好了。但我不知道这样的方式。所以...

我已经设计了两种方法来获取 HTML 查询字符串并将结果保存到哈希中。一种适用于 $ENV 查询字符串。它可以工作,但必须使用 GET,并且必须清理字符串。另一个使用 CGI。它可以使用 POST 方法进行检索,并且通常比 ENV 更干净。两者使用的代码行数大致相同,但 CGI 比 ENV 短了一行。

我的问题是:是否有一种理想、快速、高效、自信、无问题的方式在网页之间传递充满值的哈希?按照这些思路,我认为直接从 $query = new CGI() 访问值而不是使用中间步骤来重新创建哈希并重新保存值会更好?或者,至少,将其直接复制到可用的哈希中。我尝试了几种语法变体,但没有运气。我读过其他配置,但到目前为止,它们似乎比我迄今为止想出的要复杂。

这是我的示例(为了说明而进行了模拟),因此您可以看到我一直在做什么。我的实际值列表将比我在这里包含的要长。

#!/usr/bin/perl -w
use strict;
use warnings;
my $thispage = $ENV{'SCRIPT_NAME'};
$thispage =~ s/(?:.+\/)([^#?]+)/$1/ig;
print "Content-type: text/html\n\n";
print qq(<p>Save query string to hash...</p>\n);

my %hash;
my $query_string = $ENV{'QUERY_STRING'} ;
my @pairs = split(/\&/, $query_string);
foreach my $pair (@pairs){
 my ($key, $value) = split(/=/, $pair);
 $value =~ s/\+/ /g ; 
 $hash{$key} = $value ; 
}

print qq(\n<blockquote><pre>) ;
while ( my ($key,$value) = each %hash) {
# let's make it readable
print sprintf "%-9s", $key;
print "=> $value\n";
}
print qq(</pre></blockquote>\n\n) ;

print qq(<p>
<form action="$thispage" method="GET">
 <input type="hidden" name="Purple" value="Color">
 <input type="hidden" name="Orange" value="Fruit">
 <input type="hidden" name="Family" value="Relatives">
 <input type="hidden" name="Twelve" value="Number">
 <input type="hidden" name="Silver" value="Coins">
 <input type="hidden" name="Thirty" value="Middle aged">
 <input type="hidden" name="People" value="Are Hell">
 <input type="hidden" name="Future" value="Past">
 <input type="hidden" name="Banana" value="Yellow">
 <input type="hidden" name="Africa" value="Continent">
 <input type="hidden" name="Monday" value="Hateful Things">
 <input type="hidden" name="Office" value="Politics">
 <input type="hidden" name="Nature" value="Second">
 <input type="hidden" name="Eleven" value="Tufnel">
 <input type="hidden" name="Animal" value="Muppet">
 <input type="hidden" name="Rachel" value="Ex">
 <input type="submit" class="button" value="ENV Query String to Hash!">
</form>
);

__END__
#!/usr/bin/perl -w
use CGI qw(:standard);
use strict;
use warnings;
my $thispage = $ENV{'SCRIPT_NAME'};
$thispage =~ s/(?:.+\/)([^#?]+)/$1/ig;
print "Content-type: text/html\n\n";
print qq(<p>Save query string to hash...</p>\n);

my %hash;
my $query = new CGI();
my @keys = $query->param;
foreach my $key (@keys ) {
 $hash{$key} = $query->param($key);
}

print qq(\n<blockquote><pre>) ;
while ( my ($key,$value) = each %hash) {
# let's make it readable
print sprintf "%-9s", $key;
print "=> $value\n";
}
print qq(</pre></blockquote>\n\n) ;

print qq(<p>
<form action="$thispage" method="POST">
 <input type="hidden" name="Friday" value="TGIF">
 <input type="hidden" name="Yellow" value="Banana">
 <input type="hidden" name="Poetry" value="Yawn">
 <input type="hidden" name="August" value="Heat">
 <input type="hidden" name="Potato" value="Bobby">
 <input type="hidden" name="Sunday" value="School">
 <input type="hidden" name="Circle" value="Clique">
 <input type="hidden" name="Breath" value="less">
 <input type="hidden" name="Circus" value="Carnival">
 <input type="hidden" name="London" value="Bridge">
 <input type="hidden" name="Energy" value="Bill">
 <input type="hidden" name="Sister" value="Ignatius">
 <input type="hidden" name="Monkey" value="Shines">
 <input type="hidden" name="System" value="Fail">
 <input type="hidden" name="Austin" value="Steve">
 <input type="hidden" name="Secret" value="Policeman's Ball">
 <input type="submit" class="button" value="CGI Query String to Hash!">
</form>
);

__END__

感谢您抽出宝贵时间阅读本文。特别感谢您深思熟虑的回复。

干杯,

【问题讨论】:

  • 正如 Dave Cross 在下面指出的那样,现有的代码可以为您执行此操作。当你遇到一个编程问题时,问问自己是否有可能其他人也遇到过。如果是这样,请先寻找已经编写、测试和调试过的现有解决方案,然后再尝试推出自己的解决方案。
  • 嗨,安迪。我不怕做一些工作,甚至不怕花时间去弄清楚更详细的东西,但是是的,我同意,重新发明轮子是没有意义的。这就是我在这里的原因。我花了很多时间在这里和其他地方阅读。但有时值得寻找对细微之处的澄清。队友的欢呼声。感谢您的关注。

标签: html perl hash query-string


【解决方案1】:

如果您查看documentation for CGI.pm,您会看到一个标题为“Fetching the parameter list as a hash”的部分,它似乎回答了您的问题。

您可以使用 CGI 对象来做到这一点:

use CGI;

my $q = CGI->new;

my %params = $q->Vars;

或者使用基于函数的接口到模块:

use CGI ':cgi-lib';

my %params = Vars();

请注意,如果您有多个具有相同名称的参数(从查询字符串生成,如param1=foo&amp;param1=bar),则哈希中的值将是字符串,其中各个值将由字符\0 分隔。

【讨论】:

  • 你是对的。正是我想要的。澄清一点,如果可以的话。我的第一个示例 - 我的 $q = new CGI() 和您的配置 - 我的 $q = CGI->new 之间有区别吗?或者换一种说法,难道我不能使用 - 我的 %params = $q->Vars - 而不是我的 @keys = $q->param?谢谢。
  • @Bobby:像new Class 这样的语法被称为“间接对象表示法”。它在 99% 的情况下都可以正常工作,但是当它出现故障时,您将浪费数天时间试图找出问题所在。更安全、更明智的编写方式是Class-&gt;new()。没有充分的理由继续使用旧的、有缺陷的语法。我猜你使用的是旧版本的 CGI.pm,它仍然在其文档中使用狡猾的版本。
  • @Bobby:有关详细信息,请参阅perlobj 中的“间接对象表示法”部分。
  • 我不确定是否要使用旧版本。也许问题是我已经多年没有编码了。像这样的事情是很好的复习。无论如何,我已经阅读了您所指的部分,这让我知道在完成之前我还有更多要阅读的内容。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2019-03-07
  • 2015-07-10
  • 2016-10-21
  • 1970-01-01
  • 2010-09-21
  • 2013-02-12
相关资源
最近更新 更多