0

Python プロジェクトに相当する Perl を作成しています。

説明: 「from base import *」を介してすべてのスクリプトで使用されるベース モジュール「base.py」があります。ベース モジュールには、スクリプト内で実行できる共通のサブルーチン/関数があります。

Perl に対する私の試みは、各スクリプト内に「use base.pm」を配置することでした。ただし、Perl のサブルーチンはスクリプトにローカルにインポートされていないため、サブルーチンを実行するたびに「ベース」モジュールを呼び出す必要がありました。Pythonの「from base import *」に相当するPerlは何ですか?

4

3 に答える 3

4

いくつかのこと:

  • 名前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::Basefoo関数が自動的にインポートされます。

エクスポートするすべての関数を@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を参照してください。

お役に立てれば。

長文で申し訳ありませんが、私は既婚者で子供がいます。大晦日は何か他のことをしています。

于 2013-01-01T01:13:06.650 に答える
3

通常、インポートする関数を名前のリストとして指定します。

use List::Util 'max', 'min';

物事をエクスポートするほとんどのモジュールは、次のセマンティクスに従います。

use MyBase; # imports default exports (if any)
use MyBase 'baz'; # imports only baz
use MyBase (); # import nothing

モジュール内で、何をエクスポートするかを選択できるインポート クラス メソッドが呼び出されます。通常はデフォルトのリストがありますが、渡されたリストがある場合はそれを使用します。これを行うのに役立つ Exporter モジュールが存在します。

package MyBase;
use Exporter 'import';
our @EXPORT = ( 'foo', 'bar' );
our @EXPORT_OK = ( 'baz', 'quux' );

タグによってエクスポートをグループ化し、グループ全体を簡単にインポートできるようにする機能もあります。Exporter のドキュメントを参照してください。サブだけでなく、変数もエクスポートできます。

その背景で、最終的にあなたの質問に答えるために:

Exporter を使用するモジュールの場合 (すべてがそうであるとは限りません)、 // で囲まれた正規表現でインポートを指定できます。

use List::Util '/./';
于 2012-12-31T22:04:39.577 に答える
1

まず第一に、base.pmそれはコアモジュールであるため、非常に悪い名前です。次に、エクスポート可能な関数は (通常) そのように宣言する必要があります。例については、エクスポーターを参照してください。

于 2012-12-31T21:51:22.903 に答える