我正在尝试检查cgi脚本中的cookie值;我的测试脚本看起来像
#!/usr/bin/perl -w
use DBI;
use CGI qw/:standard/;
use CGI::Cookie;
my $cgiH = CGI->new;
print header;
print start_html(-title=>'Cookie Terms'), h1("Cookie Terms"), "<hr>\n";
%cookies = CGI::Cookie->fetch;
foreach $k (keys %cookies) {
my $term = "$cookies{$k}";
my $term =~ s/SubjectTerm//;
print "at $k is $term \n";
}
print end_html;
脚本的相关输入(来自HTTP GET)是
Cookie: SubjectTerm1=ponies
Cookie: SubjectTerm2=horses
(这可以通过使用fiddler或调试我的delphi应用程序中的代码来验证)。我的脚本(省略HTML包装器)的结果是
at SubjectTerm1 is
at SubjectTerm2 is
或者如果我将print语句更改为
print "at $k is $cookies{$k}\n";
它是
at SubjectTerm1 is SubjectTerm1=ponies; path=/
at SubjectTerm2 is SubjectTerm2=horses; path=/
我想要到达的是这样的
at SubjectTerm1 is ponies
at SubjectTerm2 is horses
我知道我错过了关于哈希用法的一些内容但却无法弄清楚它是什么。 我没有正确处理%cookies哈希?
答案 0 :(得分:5)
如果你有use warnings
,你会发现你正在用{<1>}打破行
$term
删除my $term =~ s/SubjectTerm//;
。
我认为您可以提取值只是将分配更改为
my
并摆脱my $term = $cookies{$k}->value();
。但不确定对不起。
答案 1 :(得分:2)
顺便一提,在我回答这个问题之前,我强烈建议你看一下使用CGI.pm以外的东西 - 这是90年代后期最好的Perl,而不是默认包含在核心perl中分发几乎没有推荐它。
一些更现代,更有特色的替代方案包括:
除此之外,正如@Sodved所说,如果您在文件顶部包含use strict;
和use warnings;
,那么您的第一个问题就是 - 使用my
两次来破坏$ term - 会立即突出显示。
一旦你使用了strict
和warnings
pragma(并且我会说,没有它们就离开家)你也会想要改变你的foreach:
foreach (keys %cookies) {
my $term = $cookies{$_};
...
OR
foreach my $k (keys %cookies) {
my $term = $cookies{$k};
...
也就是说,您需要声明$ k变量,或者您可能更喜欢在循环中使用Perl的内置$_
- 这纯粹是风格问题。