在调用 "value" 方法之前测试 perl cookie/value 是否存在

Test if perl cookie/value exists before calling "value" method

如果 cookie 已经存在,这可以正常工作

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

如果没有 cookie,则页面失败并出现此错误。

Can't call method "value" on an undefined value at /file.cgi line 23.

这个测试产生了同样的错误...大概是因为它试图做同样的事情

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

如果没有 cookie 或它的值为空,我如何检测?

谢谢。

尝试

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;
   # ...
}

如果您有一个值应该是一个对象但可能不是,您可以将调用包装在 eval 中以捕获在非对象或 undef 值上调用方法的错误:

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

如果 $myCookie 不是一个对象或没有 value 方法,$value 得到 undef 并且您的程序继续。我记得,CGI::Cookie 不会 return 一个没有值的命名 cookie 的 undef;你会得到(定义的)空字符串。因此,如果 $value 是任何定义的值,包括任何假值,则存在一个具有该名称的 cookie。

在您的情况下,您的 cookie 名称可能有误,因此您是从错误的 cookie 中查找的。在继续之前,您可以使用 exists 检查散列中的键:

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
     }