0

我有以下代码:

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 失败,我也希望脚本运行。

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

不能在没有包或对象引用的情况下调用方法“条目”

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

4

2 回答 2

1

您首先必须检查 $feed 的值。

您描述的错误消息很明显: $feed 不是包/对象引用,但它可以是例如简单的哈希。所以它被定义了。

在 if(defined) 前面添加我最喜欢的调试行:

warn Data::Dumper->new([ $feed ],[ '*feed' ])->Sortkeys(1)->Dump();use Data::Dumper;

你会以一种很好的方式看到价值。如果没有测试,我会说 $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。

于 2012-05-03T11:15:30.973 回答
0

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

在这种特殊情况下,您会看到此错误,因为您误用了||

my $feed = XML::Feed->parse(\$content) || $logger->error("When retrieving $URL: ", XML::Feed->errstr);

如果parse调用失败并返回undef,则计算结果为

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

评估为

my $feed = $logger->error("When retrieving $URL: ", XML::Feed->errstr);

. 我不知道of 的返回值$logger->error,但大概它既不是包也不是对象引用。如果它是一个,那么放入一个名为 的变量可能是错误的$feed

XML::Feed提及使用类似结构解析的文档

my $feed = XML::Feed->parse(URI->new('http://example.com/atom.xml'))
        or die XML::Feed->errstr;

这不是一回事。||它们各自的 优先规则or适用于不同的应用程序;具体来说,您应该只||在您想要某物右侧的值时使用。不要仅将其用于短路副作用。

您可以通过替换||withor来解决此问题,以获得正确的评估顺序。当您在那里时,您可能还应该消除冗余defined测试。

于 2012-05-04T20:06:22.137 回答