2012-05-02 69 views
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失敗時也能運行該腳本。

其定義的功能似乎我得到錯誤信息到不行:

無法調用「條目」沒有包裝或對象引用

誰能告訴我是什麼正確的方式來處理測試?

+1

爲您正在使用的語言適當標記。 – Lion

+0

對不起,已完成 – ehretf

+0

在解析它之前,您是否對** $ content **進行了檢查? – tuxuday

回答

1

您首先必須檢查$ feed的值。

您描述的錯誤消息很明顯:$ feed不是包/對象引用,但它可以是一個簡單的哈希值。所以它的定義。

添加我最喜歡的調試行權,如果(定義)的前面:

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); 
} 

因爲解析據說返回一個對象,我想它返回undef的錯誤。

+0

感謝您的回答。你提出的代碼工作就像一個魅力。其實,我不明白爲什麼,但它看起來像檢索XML :: Feed-> errstr set $ feed爲一個整數。因此,在檢索XML :: Feed-> errstr後,使用define()測試$ feed不再有效 – ehretf

0

錯誤消息意味着它說:$feed既不是包也不是對象引用。它通過defined測試,因爲有許多定義的值既不是包也不是對象引用。

在這種特殊情況下,你會看到這個錯誤,因爲你misuing ||

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的返回值對我來說是未知的,但大概它既不是包也不是對象引用。如果它是一個,那麼放入名爲$feed的變量可能是錯誤的。

The documentation for XML::Feed提到與構建像

這是不一樣的東西解析。它們各自的優先規則使||or適合不同的應用;具體而言,只有在右側的值爲某個值時才應使用||。不要僅用於短路的副作用。

您可以通過將||替換爲or以解決此問題,以獲得正確的評估訂單。當你在那裏時,你可能也應該消除多餘的defined測試。

相關問題