Как сохранить только значение первого параметра?

В моем приложении Perl Catalyst я обычно получаю значение параметра URL следующим образом:

my $val = $c->request->params->{arg} || '';

Но URL может содержать несколько arg=$Val. Я хочу сохранить только первое значение arg=. Я мог бы добавить это в свой код:

my $val = $c->request->params->{arg} || '';
$val = $val->[0] if (ref($val) eq 'ARRAY');

Это довольно некрасиво. Есть ли способ лучше подобрать первое значение или параметр URL?


person Julien    schedule 30.03.2013    source источник


Ответы (2)


Действительно ли ваше приложение ожидает несколько значений для параметра arg? Если нет, то все, что вам нужно, это

my $val = $c->request->params->{arg} || '';

Конечно, это будет мусор, если пользователь предоставит вам URL-адрес мусора, но вы ничего не можете сделать, чтобы пользователь не предоставил вам мусор.

Если на самом деле допустимо иметь более одного значения для параметра arg, зачем вам нужно только первое значение? На самом деле вам нужны все значения.

sub param_vals {
   my ($params, $name) = @_;
   return () if !exists($params->{name});
   return $params->{$name} if !ref($params->{name});
   return @{ $params->{$name} };
}

my @args = param_vals($c->request->{params}, 'arg');
person ikegami    schedule 30.03.2013
comment
Я ожидаю один arg=$val, наличие более одного является ошибкой клиента. - person Julien; 31.03.2013
comment
Я управляю сервером, а не клиентами! - person Julien; 31.03.2013
comment
Я знаю. Иначе то, что я сказал, не имело бы смысла. (Вы в моем последнем комментарии имели в виду пользователя.) - person ikegami; 31.03.2013
comment
Давайте использовать пример. Нет причин относиться к arg=good&arg=gargbage иначе, чем к arg=gargbage, поэтому my $val = $c->request->params->{arg} || ''; — это все, что вам нужно. - person ikegami; 31.03.2013

Я только что прочитал код для Catalyst::Request, но я не вижу ничего, что всегда вытаскивало бы одно значение. Жаль, что Кэт не использует что-то вроде Hash::MultiValue!

person sartak    schedule 30.03.2013