Perl 为什么这个定义的值不能被识别为包或对象引用?

Perl 为什么这个定义的值不能被识别为包或对象引用?,perl,class,testing,Perl,Class,Testing,我的代码如下: my $content = $response->decoded_content((charset => 'UTF-8')); my $feed = XML::Feed->parse(\$content) || $logger->error("When retrieving $URL: ", XML::Feed->errstr); if (defined $feed) { for my $entry ($feed->entries) {

我的代码如下:

my $content = $response->decoded_content((charset => 'UTF-8'));
my $feed = XML::Feed->parse(\$content) || $logger->error("When retrieving $URL: ", XML::Feed->errstr);
if (defined $feed) {
   for my $entry ($feed->entries) {
      #DO SOMETHING
   }
}
对于某些站点,XML::FEED表示它无法检测提要类型。这是我必须考虑的问题,但目前这不是我的问题。 这个示例代码在一个while循环中,我正在检索不同的RSS,我希望脚本在某些URL失败时也能运行

当我收到错误消息时,定义的函数似乎不起作用:

没有包或对象引用,无法调用方法“entries”


有人能告诉我什么是处理测试的正确方法吗?

您首先必须检查$feed的值

您描述的错误消息很明显:$feed不是包/对象引用,但它可以是一个简单的哈希。这就是定义

将我最喜欢的调试行添加到if(已定义)的正前方:

你会以一种很好的方式看到它的价值。 如果不进行测试,我会说$feed包含记录器的结果,可能是1或0之类的,因为您将$feed的值设置为XML::feed->parse,如果这不成功(未定义),则是$logger->error的结果

你最好这样写:

my $feed = XML::Feed->parse(\$content);

if (defined $feed) {
    for my $entry ($feed->entries) {
        #DO SOMETHING
    }
}
else {
    $logger->error("When retrieving $URL: ", XML::Feed->errstr);
}

因为parse被说成是返回一个对象,我猜它会在出错时返回undef。

错误消息的意思是:
$feed
既不是包也不是对象引用。它通过了
defined
测试,因为有许多定义的值既不是包也不是对象引用

在本例中,您看到此错误是因为您使用了错误的
| |

my $feed = XML::Feed->parse(\$content) || $logger->error("When retrieving $URL: ", XML::Feed->errstr);
如果
parse
调用失败并返回
unde
,则计算结果为

my $feed = ( undef || $logger->error("When retrieving $URL: ", XML::Feed->errstr) );
my $feed = $logger->error("When retrieving $URL: ", XML::Feed->errstr);
评估结果是

my $feed = ( undef || $logger->error("When retrieving $URL: ", XML::Feed->errstr) );
my $feed = $logger->error("When retrieving $URL: ", XML::Feed->errstr);
。我不知道
$logger->error
的返回值,但它可能既不是包也不是对象引用。如果它是一个,那么输入名为
$feed
的变量可能是错误的

提到使用类似

my $feed = XML::Feed->parse(URI->new('http://example.com/atom.xml'))
        or die XML::Feed->errstr;
这不是一回事。它们各自的优先规则使得
|
适用于不同的应用;具体地说,只有当您希望某个值位于右侧时,才应该使用
|
。不要仅在短路副作用时使用


您可以通过将
|
替换为
来解决此问题,以获得正确的求值顺序。在这里,您可能还应该消除冗余的
定义的
测试。

标记适合您所使用的语言。您在解析$content之前是否检查了它?谢谢您的回答。你提出的代码非常有效。实际上,我不明白为什么,但它看起来像是检索XML::Feed->errstr将$Feed设置为整数。因此,在检索XML::feed->errstr之后使用define()测试$feed不再有效