Perlモジュールで定数を定義した場合、メインプログラムでその定数をどのように使用しますか? (または、メインプログラムでその定数をどのように呼び出すのですか?)
定数は、他のパッケージシンボルと同じようにエクスポートできます。標準の Exporter モジュールを使用すると、次のようにパッケージから定数をエクスポートできます。
package Foo;
use strict;
use warnings;
use base 'Exporter';
use constant CONST => 42;
our @EXPORT_OK = ('CONST');
1;
次に、クライアントスクリプト(または他のモジュール)
use Foo 'CONST';
print CONST;
%EXPORT_TAGS
ハッシュ(エクスポーターのドキュメントを参照)を使用して、単一のインポート引数でエクスポートできる定数のグループを定義できます。
更新:複数の定数がある場合の%EXPORT_TAGS
機能の使用例を次に示します。
use constant LARRY => 42;
use constant CURLY => 43;
use constant MOE => 44;
our @EXPORT_OK = ('LARRY', 'CURLY', 'MOE');
our %EXPORT_TAGS = ( stooges => [ 'LARRY', 'CURLY', 'MOE' ] );
その後、あなたは言うことができます
use Foo ':stooges';
print "$_\n" for LARRY, CURLY, MOE;
定数は、プロトタイプが空の単なるサブなので、他のサブと同じようにエクスポートできます。
# file Foo.pm
package Foo;
use constant BAR => 123;
use Exporter qw(import);
our @EXPORT_OK = qw(BAR);
# file main.pl:
use Foo qw(BAR);
print BAR;
以前の答えを拡張すると、定数は実際には単なるサブルーチンなので、もそれらを直接呼び出すことができます:
use Foo;
print Foo::BAR;
定数の代わりに Readonly を使用することを検討してください。
package Foo;
use Readonly;
Readonly my $C1 => 'const1';
Readonly our $C2 => 'const2';
sub get_c1 { return $C1 }
1;
Perl -MFoo -e 'print "$_\n" for Foo->get_c1, $Foo::C2'
トリックの袋に追加するには、定数は単なるサブルーチンなので、クラスメソッドとして呼び出すこともできます。
package Foo;
use constant PI => 3.14;
print Foo->PI;
定数がたくさんある場合、それらをすべてエクスポートする必要なしに、時々定数を取得するのに良い方法です。ただし、Foo::PI
またはエクスポートPI
とは異なり、PerlはFoo->PI
をコンパイルしないため、メソッド呼び出しのコストが発生します(これはおそらく問題ではありません)。