Perlモジュールで定数を定義する場合、メインプログラムでその定数をどのように使用しますか?(または、メインプログラムでその定数を呼び出すにはどうすればよいですか?)
6 に答える
定数は、他のパッケージシンボルと同じようにエクスポートできます。標準のエクスポーターモジュールを使用すると、次のようなパッケージから定数をエクスポートできます。
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;
定数の代わりに読み取り専用の使用を検討することをお勧めします。
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
ため、メソッド呼び出しのコストが発生します (これはおそらく問題ではありません)。