Проверьте, существует ли perl cookie / value перед вызовом метода «value» - PullRequest
2 голосов
/ 28 февраля 2020

Это прекрасно работает, если повар ie уже существует

use CGI::Cookie;
my %cookie = CGI::Cookie->fetch;
my $val = $cookie{'MY_COOKIE'}->value;

Если нет повара ie, то страница завершается ошибкой.

Может не вызывать метод "value" для неопределенного значения в строке 23.file.cgi 23.

Этот тест выдает ту же ошибку ... предположительно, потому что он пытается сделать то же самое

if ( $cookie{'MY_COOKIE'}->value ) {
  $val = $cookie{'MY_COOKIE'}->value;
}

Как я могу определить, нет ли повара ie или у него пустое значение?

Спасибо.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Если у вас есть значение, которое должно быть объектом, но может и не быть, вы можете заключить вызов в eval, чтобы отловить ошибку вызова метода для необъектного или неопределенного значения:

my $value = eval { $myCookie->value }; # maybe an object, maybe not

Если $myCookie не является объектом или не имеет метода value, $value получает undef, и ваша программа продолжается. Насколько я помню, CGI::Cookie не вернет undef для именованного повара ie без значения; вместо этого вы получите (определенную) пустую строку. Таким образом, если $value является каким-либо определенным значением, включая любое ложное значение, был повар с этим именем ie.

В вашем случае у вас может быть неправильное имя для повара ie, так что вы смотрите не от того повара ie. Вы можете использовать exists для проверки ключа в га sh, прежде чем продолжить:

if( exists $cookie{NAME} ) { ... }

Но это не значит, что вещь в $cookie{NAME} - это объект, который вы ожидаете , Вы можете проверить, может ли он отвечать на это имя метода, прежде чем продолжить:

if( exists $cookie{NAME} and $cookie{NAME}->can('value') ) { ... }

Вы не можете просто проверить, определен ли $myCookie. Вы все еще не знаете, что в нем, и ваша программа взрывается:

my $myCookie = 123;
if( defined $myCookie ) {
     $myCookie->value;  # still a fatal runtime error
     }
1 голос
/ 28 февраля 2020

Попробуйте

use CGI::Cookie;
my %cookie = CGI::Cookie->fetch;

my $myCookie = $cookie{'MY_COOKIE'};
my $val = defined($myCookie) ? $myCookie->value : '';

ИЛИ

if( defined( my $myCookie = $cookie{'MY_COOKIE'} )) {
   my $val = $myCookie->value;
   # ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...