WedX - журнал о программировании и компьютерных науках

Почему Perl предупреждает о бесполезной константе 1 при использовании bigint?

Я писал модуль как часть своего приложения, когда заметил, что в результате проверки синтаксиса появляется предупреждение о бесполезном использовании константы (1). Это почему?

Константа - это обязательный 1 в конце модуля, который обычно игнорируется предупреждениями как _ 2_ говорит:

Это предупреждение не будет выдано для числовых констант, равных 0 или 1, поскольку они часто используются в таких операторах, как

1 while sub_with_side_effects();

(Вероятно, для этого есть даже лучший источник. В конце концов, 1 в конце файлов совершенно желательно и не о чем предупреждать.)

Но предупреждение выдается даже для почти пустых модулей, если они use bigint.

package Foo;

use bigint;

1;

Для этой простой проверки синтаксиса файла выдается следующее предупреждение:

$> perl -Wc Foo.pm
Useless use of a constant (1) in void context at Foo.pm line 5.
Foo.pm syntax OK

Мне не удалось найти никакой ссылки на bigint и предупреждающее сообщение, кроме Поместите длинные шестнадцатеричные числа в sqlite но я думаю, это не решает мою проблему.

Мой Perl - v5.14.4 на Cygwin с bigint 0.36.


  • Похоже на ошибку. 28.01.2015
  • Интересная находка. Я предполагаю, что это потому, что это больше не «1» и, следовательно, игнорируется, а вместо этого представляет собой особый вид «1». 28.01.2015

Ответы:


1

Здесь есть две проблемы.

  1. Почему use bigint; 1; предупреждает в пустом контексте?
  2. Почему константа в первую очередь выполняется в пустом контексте?

$ perl -c -we'1 while sub_with_side_effects();'
-e syntax OK

$ perl -c -we'use bigint; 1 while sub_with_side_effects();'
Useless use of a constant (1) in void context at -e line 1.
-e syntax OK

Почему use bigint; 1; предупреждает в пустом контексте?

use bigint; устанавливает обратный вызов, который вызывается, когда синтаксический анализатор встречает константный литерал, и вместо этого значение, возвращаемое обратным вызовом, используется как константа. Таким образом, под use bigint;, 1 больше не является просто 0 или 1.

Но вы не делаете ничего плохого, поэтому это предупреждение является ложным. Вы можете обойти это, используя () или undef вместо 1.

undef while sub_with_side_effects();

Если мне не нужно использовать его во всей базе кода, я бы предпочел следующее:

while ( sub_with_side_effects() ) { }

$ cat Module.pm
package Module;
use bigint;
1;

$ perl -c -w Module.pm
Useless use of a constant (1) in void context at Module.pm line 3.
Module.pm syntax OK

Почему константа выполняется в пустом контексте?

Когда Perl выполняет модуль, Perl ожидает, что модуль вернет скалярное значение, поэтому Perl должен выполнять модуль в скалярном контексте.

Однако вы сказали Perl скомпилировать скрипт Module.pm. Когда Perl выполняет сценарий, Perl не требует возврата каких-либо значений, поэтому Perl выполняет сценарий в пустом контексте.

Использование модуля в качестве сценария может вызвать ложные предупреждения и ошибки, как и передача -W. Протестируйте модуль, используя следующее:

perl -we'use Module'

На самом деле, вам даже не нужно -w, так как use warnings; у вас уже должно быть в модуле. Все, что вам действительно нужно, это

perl -e'use Module'
28.01.2015

2

-W вместо use warnings; в вашем модуле или проверка модулей с помощью -c вместо perl -MFoo -e0 может показать ложные ошибки. Это пример последнего.

Когда вы загружаете модуль в обычном режиме, он не в пустом контексте, потому что он проверяет истинность результата.

(Обратите внимание, что когда я пробую использовать 5.20.1, -W также приводит к ложному overload arg '..' is invalid at /usr/share/perl/5.20/Math/BigInt.pm line 155.)

28.01.2015
  • Как ни странно, perl -MFoo -we0 не работает при тестировании bigint. perl -we'use bigint;' делает то же самое без предупреждения. 28.01.2015
  • ах, вы имеете в виду -Mbigint; да, это иронично. perl -MFoo -we# работает 29.01.2015
  • Boggle ... настоящие ошибки, сбои или проблемы с контролем качества ?? 29.01.2015
  • @ G.Cito: нет, здесь нет ошибки 29.01.2015

  • 3

    Просто оставьте здесь обходной путь, чтобы избежать предупреждения: определение константы со значением 1 перед использованием bigint:

    package Foo;
    use strict;
    use warnings;
    use constant PACKAGE_END => 1;
    use bigint;
    
    PACKAGE_END;
    
    12.04.2019
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]