8

アプリケーションの一部としてモジュールを作成していたときに、構文チェックの結果、定数 (1) の無駄な使用に関する警告が表示されることに気付きました。何故ですか?

定数は1モジュールの最後で必須であり、通常はperldoc perldiag次のように警告によって無視されます。

この警告は、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

Put long hex numbers in sqlitebigint以外の参照と警告メッセージは見つかりませんでしたが、これは実際には私の問題に対処していないと思います。

私の Perl は、Cygwin で bigint 0.36 の v5.14.4 です。

4

3 に答える 3

8

ここには 2 つの問題があります。

  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;パーサーが定数リテラルに遭遇したときに呼び出されるコールバックをインストールし、コールバックによって返された値が代わりに定数として使用されます。そのため、 underは、単なるoruse bigint;ではなくなりました。101

しかし、あなたは何も悪いことをしていないので、この警告は偽物です。()または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 はスカラー コンテキストでモジュールを実行する必要があります。

ただし、スクリプト Module.pmをコンパイルするように Perl に指示しました。Perl がスクリプトを実行するとき、Perl は値を返す必要がないため、Perl は無効なコンテキストでスクリプトを実行します。

モジュールをスクリプトとして使用すると、誤った警告やエラーが発生する可能性があり、-W. 次のようにモジュールをテストします。

perl -we'use Module'

実際には、-wすでにuse warnings;モジュールにあるはずなので、必要ありません。本当に必要なのは

perl -e'use Module'
于 2015-01-28T20:44:40.723 に答える
6

モジュール内の代わりに -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。)

于 2015-01-28T20:01:32.013 に答える