我正在使用Perl的Encode.pm模块,直接从CPAN下载(我已更新到最新版本,2.84,它在RHEL上的Perl 5.10.1上运行)。当我使用它时,它会发出有关Encode.pm的第111,115和172行的警告,如下所示:
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服务器日志中也是不必要的混乱。
答案 0 :(得分: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
的来电,请更新您的问题以添加一个小的,可运行的脚本,该脚本会产生警告,我们可以帮助您清理它。
答案 1 :(得分:0)
我终于找到了问题所在。在我的代码中,我获取了一段文本并检测它使用的编码:
my $encoding_name = Encode::Detect::Detector::detect($hdata);
但是,某些文本是纯文本,而Detector不会在这些块上返回编码名称。此空白编码名称将传递给decode
函数,导致它提供我报告的警告。为了避免这种情况,我只是在运行decode之前开始检查以确保我有一个$encoding_name
:
if ($encoding_name) {
$hdata = decode($encoding_name, $hdata);
}