2016-07-31 89 views
0

我使用Perl的Encode.pm模塊,直接從CPAN下載(我已更新到最新版本2.84,並且它在RHEL上的Perl 5.10.1上運行)。當我使用它,它會發出約111線,115警告和Encode.pm 172看起來像這樣:禁用Encode.pm的警告

Use of uninitialized value $name in concatenation (.) or string at /usr/lib64/perl5/Encode.pm line 186. 

這是相當令人沮喪,因爲該警告似乎是關於Encode.pm東西,而比我的代碼,我真的只想看到我的代碼警告。我沒有打開「-w」標誌,但Encode.pm自身內部已啓用use warnings。有沒有辦法隱藏模塊的警告或以其他方式修復這種情況,而不必分叉Encode.pm?

我知道靜音警告在某些方面可能是一個壞主意,但來自Encode.pm的大量警告使我很難發現由我自己的代碼生成的警告,因爲我試圖調試它。這在Web服務器日誌中也是不必要的麻煩。

+5

https://metacpan.org/source/DANKOGAI/Encode-2.84/Encode.pm#L186 只有如果您使用的模塊錯誤,則爲警告。在這種情況下,屏蔽警告也是一個糟糕的主意。 – mob

+4

我建議您發佈一個發佈警告的最小示例。請參閱[如何創建最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve) –

回答

6

查找您在問題(https://metacpan.org/source/DANKOGAI/Encode-2.84/Encode.pm#L186)中複製的錯誤消息中引用的行,我們發現$name直接來自提供給decode函數的參數。如果發出該警告,則直接導致您的代碼錯誤地調用decode

根據Encode的文檔,decode的正確用法形式爲$string = decode(ENCODING, OCTETS[, CHECK]),具體示例爲$string = decode("iso-8859-1", $octets);。回到源代碼,第一個參數進入$name - 這是$octets使用的編碼名稱。

因此,警告會告訴您關於代碼中的嚴重問題 - 您無法合理地期望通過嘗試對值進行解碼而不指定其編碼,從而獲得有意義的結果。你需要在你的代碼中修正這個非常真實的問題,而不是僅僅消除由此產生的警告。如果您需要幫助來修復您的電話decode,那麼請更新您的問題以添加一個小的,可運行的腳本,它會產生警告,我們可以幫助您清理它。

+0

謝謝,戴夫!你是對的。我找到了這個問題並在下面註明了它。 –

0

我終於找到了問題。在我的代碼,我把文本塊,並檢測它使用的編碼:

my $encoding_name = Encode::Detect::Detector::detect($hdata); 

然而,一些文字是純文本和探測器不會對那些塊返回編碼名稱。這個空白的編碼名稱被傳遞給decode函數,導致它給出我報告的警告。爲了避免這種情況,我只是開始檢查,以確保我跑前解碼有一個$encoding_name

if ($encoding_name) { 
    $hdata = decode($encoding_name, $hdata); 
}