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

(これは、フィドラーを使用するか、デルファイ アプリでコードをデバッグすることによって検証されます)。私のスクリプトの結果(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 が言うように、ファイルの先頭に最初の問題 (2 回使用して $term を壊す) を含めるuse strict;と、すぐに強調表示されます。use warnings;my

strictandプラグマを使用したらwarnings(そして、プラグマなしで家を出ないでください)、 foreach を次のいずれかに変更することもできます。

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

また

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

つまり、$k 変数を宣言する必要があるか$_、ループ内で Perl のビルトインを使用することを好むかもしれません。これは純粋にスタイルの問題です。

幸運を!

于 2013-05-30T17:22:34.217 に答える