sub parse {
my ($self,$raw_cookie) = @_;
my %results;
my @pairs = split("[;,] ?",$raw_cookie);
foreach (@pairs) {
s/\s*(.*?)\s*/$1/;
my($key,$value) = split("=",$_,2);
# Some foreign cookies are not in name=value format, so ignore
# them.
next if !defined($value);
my @values = ();
if ($value ne '') {
@values = map unescape($_),split(/[&;]/,$value.'&dmy');
pop @values;
}
$key = unescape($key);
# A bug in Netscape can cause several cookies with same name to
# appear. The FIRST one in HTTP_COOKIE is the most recent version.
$results{$key} ||= $self->new(-name=>$key,-value=>\@values);
}
return \%results unless wantarray;
return %results;
}
任何人都知道为什么@values = map unescape($_),split(/[&;]/,$value.'&dmy');
存在?
为什么必须先将它转换为数组?
答案 0 :(得分:1)
Cookie可以包含多个字段,每个字段可以包含多个值。使用的分隔符是分号和&符号:
time=12345678; items=123&456&789; other=abc
或逗号和分号:
time=12345678, items=123;456;789, other=abc
请注意,在第二种情况下,空格可能不在分号后面 - 否则它将被解释为字段赋值分隔符。
因此,要回答您的问题,它会转换为数组,因为Cookie字段可以包含多个值。
答案 1 :(得分:1)
转换?第一?你的问题没有多大意义。我假设你想知道填充@values
的代码是什么。
有问题的代码采用包含一系列值的字符串,并将其分隔为值列表。这个列表存储在一个数组中,因为它是唯一可以容纳它的变量类型。
我不清楚为什么添加&dmy
然后删除。我怀疑这是为了防止split
删除空的尾随参数,但-1
的第三个参数可以更清楚地做到这一点。