在调用";之前测试perl 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

如果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 = $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。这确实让我感到惊讶。无论如何,我已经添加了您的更改并建议处理。测试看起来很棒!谢谢。被定义并不意味着它会响应方法调用。这可能适用于这种特殊情况,但总的来说,这不是一个好习惯。干得好。看起来我需要更深入地了解“定义”与“评估”与“存在”,但这没关系,因为它们正是我需要复习的东西。谢谢你给我指明了这个方向。