1

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

(这是通过使用提琴手或调试我的delphi应用程序中的代码来验证的)。我的脚本(省略 HTML 包装器)的结果是

at SubjectTerm1 is  
at SubjectTerm2 is  

或者如果我将打印语句更改为

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 哈希吗?

4

2 回答 2

5

如果你有你会看到你正在用这条线use warnings破坏$term

my $term =~ s/SubjectTerm//;

删除my.

我认为您可能能够提取值只是将分配更改为

my $term = $cookies{$k}->value();

并摆脱s/SubjectTerm//. 但不确定这个对不起。

于 2013-05-30T16:44:21.127 回答
2

顺便说一句,在我回答这个问题之前,我强烈建议你看看使用 CGI.pm 以外的东西——它是 90 年代后期最好的 Perl,除了默认包含在核心 perl 发行版中之外,几乎没有推荐它。

一些更现代、更有特色的替代品包括:

除此之外,正如@Sodved 所说,如果您在文件的顶部包含use strict;use warnings;第一个问题——通过使用my两次来破坏 $term ——将立即突出显示。

一旦你使用了strictandwarnings编译指示(我想说,不要没有它们就离开家),你还需要将你的 foreach 更改为:

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

或者

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

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

祝你好运!

于 2013-05-30T17:22:34.217 回答