2012-04-01 28 views
0

我不明白爲什麼以下:爲什麼Perl短路評估導致檢查右值?

my $err = undef; 

while(1){ 
    if($err && ($err->code == 502)) { 
    [...] 
    } 
    [...] 
    eval {...} 
    $err = [email protected]; 
} 

導致Can't call method "code" on an undefined value at ./filename.pl line 74.在Perl v5.8.8。換句話說:爲什麼perl執行第二個布爾表達式,即使OP1 && OP2構造不能由於第一個操作數爲false(undef)而變爲true。

即使更詳細的版本if((defined $err) && ($err->code == 502))也會產生相同的結果。

感謝提前:)

+1

我無法重現(確切地說,在5.10上)。你能給出一個小而完整的程序來證明問題嗎? – ruakh 2012-04-01 20:58:37

+0

我的評論包含一個完整的Perl腳本。我不知道如何在此評論專欄中閱讀這篇文章,所以讓我把它作爲下面的答案張貼。 – thb 2012-04-01 21:07:16

+0

對不起,但該程序使用Net :: Twitter(相當多deos),並使用縮減代碼片段時,它確實做正確的事情...請耐心等待,我會嘗試找到一個示例 – Julian 2012-04-01 21:09:24

回答

1

的信息,當我運行的代碼在一個Perl 5.10.1解釋如下,我沒有得到任何錯誤信息都沒有。 (這真是一個多回答一個評論,只是它不適合在評論欄。它不需要給予好評。)

#!/usr/bin/perl 
use warnings; 
use strict; 
use integer; 

my $err = undef; 

while(1){ 
    if($err && ($err->code == 502)) { 
    warn; 
    } 
    eval {1}; 
    $err = [email protected]; 
} 
1

如果是民主基金如你所說,或者Perl版本的您的構建perl是錯誤的,如果你從該代碼中獲得該行爲。兩者都不可能。

但它可能不是undef。請記住,錯誤可能不是來自循環的第一遍。 $err可能包含一個有錯誤重載操作符的對象(例如不一致的布爾值和字符串重載)。以下顯示的是什麼?

use Devel::Peek; 
Dump($err); 
+0

這真的很奇怪,如果我只執行相關的片段,行爲就像預期的那樣,一旦我運行整個腳本,這個腳本太長,發生錯誤......我目前正在構建一個5.14,讓我們來看看是否有幫助 – Julian 2012-04-01 21:20:44

+0

@Julian Kessel,Updated – ikegami 2012-04-01 21:21:09

+0

該行顯示:'SV = NULL(0x0)at 0xec61670 REFCNT = 1 FLAGS =(PADBUSY,PADMY) ' – Julian 2012-04-01 21:28:23

0

爲什麼$ ERR($ @)顯然不是undefeval{}是,eval內催生函數返回一個錯誤東陽其殘疾從沒有被抓到一個文件中讀取的原因sourrounding代碼:(

感謝@ikegami您的建議,我使用dump畢竟得到了蹤影。

因此,對於問題的解決方案是democode,遺憾的是外面。我剛剛創建檔案...