2016-07-31 2 views
0

Я использую модуль Encode.pm от Perl, загружаемый непосредственно из CPAN (я обновил его до последней версии, 2.84, и он работает на Perl 5.10.1 на RHEL). Как я использую его, он выдает предупреждения о строках 111, 115, и 172 из Encode.pm, которые выглядят следующим образом:Отключить предупреждения 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 затрудняет мне выявление предупреждений, генерируемых моим собственным кодом, поскольку я пытаюсь отлаживать Это. Он также бесполезен в журналах веб-сервера.

+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); 
} 
Смежные вопросы