web-dev-qa-db-ja.com

Perlモジュールの定数を使用するにはどうすればよいですか?

Perlモジュールで定数を定義した場合、メインプログラムでその定数をどのように使用しますか? (または、メインプログラムでその定数をどのように呼び出すのですか?)

41
PNMNS

定数は、他のパッケージシンボルと同じようにエクスポートできます。標準の 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;
48
friedo

定数は、プロトタイプが空の単なるサブなので、他のサブと同じようにエクスポートできます。

# 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;
26
moritz

以前の答えを拡張すると、定数は実際には単なるサブルーチンなので、それらを直接呼び出すことができます:

use Foo;
print Foo::BAR;
21
Tanktalus

定数の代わりに Readonly を使用することを検討してください。

17
Berserk
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'
8
maletin

トリックの袋に追加するには、定数は単なるサブルーチンなので、クラスメソッドとして呼び出すこともできます。

package Foo;
use constant PI => 3.14;

print Foo->PI;

定数がたくさんある場合、それらをすべてエクスポートする必要なしに、時々定数を取得するのに良い方法です。ただし、Foo::PIまたはエクスポートPIとは異なり、PerlはFoo->PIをコンパイルしないため、メソッド呼び出しのコストが発生します(これはおそらく問題ではありません)。

6
Schwern