Если у вас есть значение, которое должно быть объектом, но может и не быть, вы можете заключить вызов в 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
}