いくつかのこと:
- 名前
Local
空間は、ローカル モジュールに使用するのに適しています。PerlLocal
は、この目的のために特別に予約しています。正式なモジュールがLocal
名前空間に含まれることはありません。
- Perl は Python ではありません。Perl は少し違うことをします。まったく同じものがある場合もあれば、ない場合もあります。これには正確に相当するものはありません。近いですが、正確ではありません。
方法 #1: 関数をエクスポートしない
モジュールに定義したすべての関数は、完全な名前空間を前に付けると利用できます。これは、モジュールから関数を定義して使用する最も簡単な方法であり、問題が発生する可能性が最も低くなります。関数がどこから来たのかを簡単に確認でき、同じ関数名を使用する 2 つのモジュールで問題が発生することはありません。
Local::Base
単一の機能を持つというモジュールがあります。私のプログラムは、次のように参照するだけで、この関数を使用できますLocal::Base::foo
。
マイプログラム
use strict;
use warnings;
use feature qw(say);
use Local::Base;
my $foo_string = Local::Base::foo("string");
say "Foo: $foo_string";
ローカル/ベース.pm
package Local::Base;
use strict;
use warnings;
sub foo {
my $string = shift;
return qq(I've foo'd "$string"!);
}
1;
方法 2:Exporter
プラグマを使用して自動的にエクスポートするものを指定する
Perl にはExporterという特別なプラグマがあり、プログラムに自動的にインポートされるモジュールを指定できます。
これは、任意の定義済み関数を指定できる Python とは異なります。代わりに、エクスポートしたいものをリストする必要があります。これには、Python の方法よりも不利な点があります。Python では、新しい関数を作成すると、何もしなくても自動的にインポートされます。また、Python の方法よりも大きな利点があります。Python では、新しい関数を作成すると、インポートするかどうかに関係なく、何もしなくても自動的にインポートされます。人々に使用してほしくないプライベート関数を書いた場合は想像できます。Python では、自動的に使用可能になります。Perl では、次のように指定しない限り、そうではありません。
マイプログラム
use strict;
use warnings;
use feature qw(say);
use Local::Base;
my $foo_string = foo("string");
say "Foo: $foo_string";
ローカル/ベース.pm
package Local::Base;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT = qw(foo);
sub foo {
my $string = shift;
return qq(I've foo'd "$string"!);
}
1;
これで、 を使用するたびにLocal::Base
、foo
関数が自動的にインポートされます。
エクスポートするすべての関数を@EXPORT
配列にリストしていることに注意してください。our
(また、その配列をa ではなくan で宣言していることにも注意してくださいmy
。つまりour
、@EXPORT
は PACKAGE 変数です。) qw(...)
構文にも注意してください。これは引用語です。すべての単語は、配列の個別の要素です。コンマは使用しません:
my @array = ("one", "two", "three");
my @array = qw(one two three);
これらはどちらも同等です。次のように表示することもできます。
my @array = qw/one two three/;
私は括弧が好きですが、スラッシュが標準になりがちです。
方法 #3: エクスポートするときは優しくする
今後、自動エクスポートを使用することはお勧めしません。古いモジュールはFile::Copy
今でもそうですが、新しいモジュールでは自分のものをインポートする必要があります。これもExporterプラグマを使用しますが、@EXPORT_OK
代わりに指定します@EXPORT
。
ここで、 を使用するように指定するときにLocal::Base
、プログラムにインポートする関数を指定する必要があります。
マイプログラム
use strict;
use warnings;
use feature qw(say);
use Local::Base qw(foo);
my $foo_string = foo("string");
say "Foo: $foo_string";
ローカル/ベース.pm
package Local::Base;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT_OK; = qw(foo);
sub foo {
my $string = shift;
return qq(I've foo'd "$string"!);
}
1;
これにより、ユーザーは使用したいモジュール内の関数を文書化する必要があります。このようにして、インポートされた関数がどこから来たのかがわかります。それは良いプログラミングの練習を強制します。さらに、複数のモジュールを使用していて、それらの関数名が類似している場合は、必要なモジュールのモジュールを確実に使用することができます。(他のものを使用したい場合は、関数の前に接頭辞を付けたパッケージ名を指定できることを忘れないでください)。
私が Python プログラマーであり、優れたプログラミング手法を気にしない場合はどうなりますか? (待ってください、それはまったく正しくありませんでした...)正規表現を指定することで、Python の方法で (ある程度) 行うことができます (結局のところ、これは Perl です)。
use Local::Base '/.+/';
@EXPORT
これにより、両方にリストされ、@EXPORT_OK
この正規表現に一致するすべてのモジュールがエクスポートされます。@EXPORT
これはすべてに一致するため、およびにリストしたすべてをインポートします@EXPORT_OK
。すべての関数をインポートするわけではありません。@EXPORT
および@EXPORT_OK
配列内の関数のみをインポートします。もちろん、任意の正規表現や ant 正規表現を指定することもできます。bar
これにより、名前に次のものを除くすべてのエクスポート可能な関数がエクスポートされます。
use Local::Base '!/bar/';
Exporter プラグマを見て、他にどのような機能があるかを確認してください。たとえば、関数をタグにグループ化できます。こうすることで、ユーザーはタグだけで特定の関数セットを指定できます。良い例については、Math::Trigを参照してください。
お役に立てれば。
長文で申し訳ありませんが、私は既婚者で子供がいます。大晦日は何か他のことをしています。