【发布时间】: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