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 の値を 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);

. の戻り値$logger->errorは不明ですが、おそらくパッケージでもオブジェクト参照でもありません。そして、それが 1 つである場合、 という名前の変数に入れるのはおそらく間違っているでしょう$feed

XML::Feed次のような構造で解析する言及のドキュメント

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

これは同じことではありません。 それらのそれぞれの優先規則は、さまざまなアプリケーション||or適しています。具体的には||、何かの右側の値が必要な場合にのみ使用する必要があります。短絡の副作用だけに使用しないでください。

||これを解決するには、をに置き換えてor、正しい評価順序を取得します。そこにいる間、おそらく冗長なdefinedテストも排除する必要があります。

于 2012-05-04T20:06:22.137 に答える