Warum warnt Perl bei Verwendung von bigint vor "nutzloser Konstante 1"?

8

Ich habe ein Modul als Teil meiner Anwendung geschrieben, als ich festgestellt habe, dass die Ergebnisse der Syntaxprüfung über nutzlosen Gebrauch einer Konstanten (1) warnen. Warum ist das so?

Die Konstante ist das obligatorische 1 am Ende des Moduls, das normalerweise von Warnungen ignoriert wird als perldoc perldiag sagt:

  

Diese Warnung wird nicht für numerische Konstanten ausgegeben, die gleich 0 oder 1 sind, da sie häufig in Anweisungen wie

verwendet werden %Vor%

(Es gibt wahrscheinlich eine noch bessere Quelle dafür. Schließlich ist 1 am Ende der Dateien total erwünscht und sollte nicht gewarnt werden.)

Aber die Warnung wird auch für fast leere Module generiert, wenn sie use bigint .

%Vor%

Bei dieser einfachen Dateisyntaxprüfung wird folgende Warnung ausgegeben:

%Vor%

Ich konnte keinen Verweis auf bigint und die Warnmeldung finden außer Put long hex Zahlen in sqlite , aber das spricht mein Problem nicht an, denke ich.

My Perl ist v5.14.4 auf Cygwin mit bigint 0.36.

    
Daniel Böhmer 28.01.2015, 18:31
quelle

2 Antworten

8

Hier gibt es zwei Probleme.

  1. Warum warnt use bigint; 1; im leeren Kontext?
  2. Warum wird die Konstante überhaupt im leeren Kontext ausgeführt?
%Vor%

Warum warnt use bigint; 1; im leeren Kontext?

use bigint; installiert einen Callback, der aufgerufen wird, wenn der Parser ein konstantes Literal vorfindet, und der vom Callback zurückgegebene Wert wird stattdessen als Konstante verwendet. Daher ist use bigint; unter 1 nicht mehr wirklich nur ein einfaches 0 oder 1 .

Aber du machst nichts falsch, also ist diese Warnung falsch. Sie können umgehen, indem Sie () oder undef anstelle von 1 verwenden.

%Vor%

Wenn ich es nicht in meiner Codebasis verwenden wollte, würde ich Folgendes bevorzugen:

%Vor% %Vor%

Warum wird die Konstante im leeren Kontext ausgeführt?

Wenn Perl ein Modul ausführt, erwartet Perl, dass das Modul einen skalaren Wert zurückgibt, also sollte Perl das Modul im skalaren Kontext ausführen.

Sie haben Perl jedoch angewiesen, das -Skript Module.pm zu kompilieren. Wenn Perl ein Skript ausführt, müssen in Perl keine Werte zurückgegeben werden. Daher führt Perl das Skript im void-Kontext aus.

Wenn Sie ein Modul als Skript verwenden, kann dies zu falschen Warnungen und Fehlern führen und somit -W übergeben. Testen Sie ein Modul wie folgt:

%Vor%

Eigentlich sollten Sie nicht einmal -w benötigen, da Sie bereits use warnings; im Modul haben sollten. Alles was du wirklich brauchst ist

%Vor%     
ikegami 28.01.2015, 20:44
quelle
6

-W anstelle von use warnings; in Ihrem Modul oder das Überprüfen von Modulen mit -c anstelle von perl -MFoo -e0 kann fehlerhafte Fehler anzeigen. Dies ist ein Beispiel für Letzteres.

Wenn Sie ein Modul normal laden, ist nicht im void-Kontext , weil es prüft, ob das Ergebnis wahr ist.

(Beachten Sie, dass, wenn ich es mit 5.20.1 versuche, das -W auch eine falsche overload arg '..' is invalid at /usr/share/perl/5.20/Math/BigInt.pm line 155 ergibt.)

    
ysth 28.01.2015 20:01
quelle

Tags und Links