О том, как CGI :: Cookie анализирует cookie - PullRequest
0 голосов
/ 22 августа 2011
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 ]

1 голос
/ 22 августа 2011

Старинная? Первый? Ваш вопрос не имеет большого смысла. Я предполагаю, что вы хотите знать, что делает код, который заполняет @values.

Данный код берет строку, содержащую серию значений, и разделяет ее на список значений. Этот список хранится в массиве, потому что это единственный тип переменной, который будет содержать это.

Мне не ясно, почему &dmy добавляется, а затем удаляется. Я подозреваю, что это предотвращает удаление пустых конечных аргументов split, но третий аргумент -1 сделает это более четко.

1 голос
/ 22 августа 2011

Файл cookie может иметь несколько полей, и каждое поле может иметь несколько значений.В качестве разделителей используются точки с запятой и амперсанды:

time=12345678; items=123&456&789; other=abc

или альтернативные запятые и точки с запятой:

time=12345678, items=123;456;789, other=abc

Обратите внимание, что во втором случае пробел может не следовать за точкой с запятой- иначе он будет интерпретирован как разделитель присваивания полей.

Таким образом, чтобы ответить на ваш вопрос, он преобразуется в массив, потому что поле cookie может иметь несколько значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...