关于CGI :: Cookie解析cookie的方式

时间:2011-08-22 03:28:01

标签: perl

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');存在?

为什么必须先将它转换为数组?

2 个答案:

答案 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的第三个参数可以更清楚地做到这一点。