在调用";之前测试perl cookie/值是否存在;“价值”;方法
如果cookie已经存在,则此操作可以正常工作在调用";之前测试perl cookie/值是否存在;“价值”;方法,perl,cookies,cgi,Perl,Cookies,Cgi,如果cookie已经存在,则此操作可以正常工作 use CGI::Cookie; my %cookie = CGI::Cookie->fetch; my $val = $cookie{'MY_COOKIE'}->value; 如果没有cookie,则页面会因此错误而失败 无法在/file.cgi第23行对未定义的值调用方法“value” 此测试生成相同的错误。。。大概是因为它想做同样的事情 if ( $cookie{'MY_COOKIE'}->value ) { $val
use CGI::Cookie;
my %cookie = CGI::Cookie->fetch;
my $val = $cookie{'MY_COOKIE'}->value;
如果没有cookie,则页面会因此错误而失败
无法在/file.cgi第23行对未定义的值调用方法“value”
此测试生成相同的错误。。。大概是因为它想做同样的事情
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 : '';
或
如果您的值应该是对象,但可能不是对象,则可以将调用包装在
eval
中,以捕获在非对象或未定义值上调用方法的错误:
my $value = eval { $myCookie->value }; # maybe an object, maybe not
如果$mycokie
不是对象或没有值
方法,$value
将被取消定义,程序将继续。我记得,CGI::Cookie
不会为没有值的命名Cookie返回undef;您将得到(定义的)空字符串。因此,如果$value
是任何定义的值,包括任何假值,则存在具有该名称的cookie
在您的情况下,您可能对cookie使用了错误的名称,因此您从错误的cookie中查找。在继续之前,您可以使用exists
检查散列中的密钥:
if( exists $cookie{NAME} ) { ... }
if( exists $cookie{NAME} and $cookie{NAME}->can('value') ) { ... }
但是,这并不意味着$cookie{NAME}
中的东西就是您所期望的那种对象。在继续之前,您可能希望检查它是否可以响应该方法名称:
if( exists $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
}
或者,您也可以选择较短的语法
my$val=$mycokie->value/'
@ThomasLang$mycokie可能是undef
啊,是的,我的错。@AnFi。我读过很多关于cookie的文章,但要么我从来没有看到过,要么他们没有提到复制我想要的特定cookie。这确实让我感到惊讶。无论如何,我已经添加了您的更改并建议处理。测试看起来很棒!谢谢。被定义并不意味着它会响应方法调用。这可能适用于这种特殊情况,但总的来说,这不是一个好习惯。干得好。看起来我需要更深入地了解“定义”与“评估”与“存在”,但这没关系,因为它们正是我需要复习的东西。谢谢你给我指明了这个方向。