使用perl cgi来获取cookie

时间:2013-05-30 16:28:13

标签: perl cookies cgi

我正在尝试检查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哈希?

2 个答案:

答案 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 - 会立即突出显示。

一旦你使用了strictwarnings pragma(并且我会说,没有它们就离开家)你也会想要改变你的foreach:

foreach (keys %cookies) {
    my $term = $cookies{$_};
...

OR

foreach my $k (keys %cookies) {
    my $term = $cookies{$k};
...

也就是说,您需要声明$ k变量,或者您可能更喜欢在循环中使用Perl的内置$_ - 这纯粹是风格问题。

祝你好运!