【问题标题】:Test if perl cookie/value exists before calling "value" method在调用“value”方法之前测试 perl cookie/value 是否存在
【发布时间】:2020-06-12 04:37:37
【问题描述】:

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

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

如果没有 cookie,则页面会因此错误而失败。

无法在 /file.cgi 第 23 行的未定义值上调用方法“值”。

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

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

我如何检测是否没有 cookie 或它有一个空值?

谢谢。

【问题讨论】:

    标签: perl cookies cgi


    【解决方案1】:

    试试

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

    【讨论】:

    • 或者你也可以选择更短的语法my $val = $myCookie->value // ''
    • @ThomasLang $myCookie 可能是undef
    • 啊,是的,我的错。
    • @AnFi。我已经阅读了很多关于 cookie 的页面,但要么我从未见过,要么他们没有提到复制我所追求的特定 cookie。它确实让我想知道。无论如何,我已经添加了您的更改并建议处理。测试看起来很棒!谢谢。
    • 被定义并不意味着它响应方法调用。这可能适用于这种特殊情况,但总的来说这不是一个好习惯。
    【解决方案2】:

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

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

    如果$myCookie 不是对象或没有value 方法,$value 将取消定义并且您的程序继续。我记得,CGI::Cookie 不会为没有值的命名 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
         }
    

    【讨论】:

    • 干得好。看起来我需要更深入地了解“已定义”、“评估”和“存在”,但这没关系,因为它们正是我需要复习的东西。感谢您为我指明这个方向。
    猜你喜欢
    • 2016-06-26
    • 2010-10-22
    • 2012-09-27
    • 1970-01-01
    • 2012-02-14
    • 2015-07-23
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多