HTML 将查询字符串转换为 Perl 哈希?

HTML Query String into Perl Hash?

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

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/(?:.+\/)([^#?]+)//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/(?:.+\/)([^#?]+)//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__

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

干杯,

如果您查看 documentation for CGI.pm, you'll see a section entitled "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&param1=bar 等查询字符串生成),则哈希中的值将是字符串,其中各个值将由字符 [= 分隔=13=].