在调用 "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
}
如果 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
}