2016-07-31 91 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); 
}