4

私はPerlの初心者であり、Perlプログラムを構築するための最良の方法を頭の中で構築しようとしています。私はPythonに精通しており、 from foo import barPythonモジュールから関数とクラスをインポートするPythonの方法に慣れています。私がPerlで理解したように、これを行うには多くの方法があります。.pmと.plモジュール、EXPORTと@ISA、useとrequireなどです。初心者が違いを明確に理解するのは簡単ではありません。それぞれの長所と短所(BeginningPerlとIntermediatePerlを読んだ後でも)。

問題は述べられています、私の現在の質問はからの文に関連していperldoc perlmodます:

Perlモジュールファイルの拡張子は.pmです。オペレーターはこれを想定しているため、use「Module.pm」を引用符で囲む必要はありません。これは、新しいモジュールを古い.plおよび.phファイルと区別するのにも役立ちます。

モジュールを準備する古い.plの方法と新しい.pmの方法の違いはどれですか?

彼らは本当に古く現代的な方法ですか?(Perlmodがそう言っているからだと思いますが、これについていくつかの情報を入手したいと思います)。

4

4 に答える 4

9

usefunctionおよび-typeモジュールは、.pm16年前に来月リリースされたPerl5で導入されました。perlmodが参照している「古い.plおよび.phファイル」はPerl4(およびそれ以前)で使用されていました。現時点では、それらはコンピューターの歴史家にとってのみ興味深いものです。.plあなたの目的のために、ただライブラリを忘れてください。

于 2010-09-17T09:32:02.553 に答える
4

モジュールを準備する古い.plの方法と新しい.pmの方法の違いはどれですか?

Perl独自の標準ライブラリ内にいくつかの古いモジュールを見つけることができます(によって示される@INCように、パスはperl -V出力に表示されます)。

昔は、パッケージはありませんでした。1つは、たとえばrequire "open2.pl";、呼び出し元のスクリプトにファイルの内容をそのまま含めることに類似していることです。すべての関数が宣言され、すべてのグローバル変数がスクリプトのコンテキストの一部になりました。言い換えれば、あなたの文脈を汚染することです。複数のファイルを含めると、すべての競合が発生する可能性があります。

新しいモジュールは、packageキーワードを使用して、名前空間の独自のコンテキストと名前を定義します。スクリプトによって-edされた場合use、新しいモジュールはスクリプトの直接のコンテキストに何もインポート/追加しない可能性があるため、名前空間の汚染と潜在的な競合を防ぎます。

@EXPORT/@EXPORT_OKリストは、モジュール関数を呼び出し元のコンテキストにインポートするのに役立つ標準のユーティリティモジュールによって使用されますExporter。これにより、関数のフルネームを常に書き込む必要がなくなります。useリストは通常​​、でなどに渡されるパラメータリストに応じてモジュールによってカスタマイズされますuse POSIX qw/:errno_h/;。詳細については、を参照perldoc Exporterしてください。

@ISAPerlの継承メカニズムです。現在のパッケージ内に関数が見つからない場合は、に記載されているすべてのパッケージ内の関数をスキャンするようにPerlに指示します@ISA。単純なモジュールには、多くの場合、そのメソッドExporterを使用するために言及されているものだけがあります(同じでよく説明されています)。import()perldoc Exporter

于 2010-09-17T09:52:49.803 に答える
3

.plファイル(「pl」は実際には「Perlライブラリ」を表します)を作成してコードを再利用することは、「package」キーワードと「use」ステートメントを使用する前のPerl4で行われた方法でした。

それは物事を行うための厄介な古い方法です。それを推奨するドキュメントに出くわした場合、それは本当に古いか、15年以上Perl開発に遅れをとっていない誰かによって書かれたドキュメントを無視する必要があることを強く示しています。

最新の方法でPerlモジュールを構築するさまざまな方法の例については、Perlモジュールメソッド呼び出しに対する私の回答を参照してください。${SOMEFILE}行${SOMELINE}の未定義の値でメソッド「X」を呼び出すことはできません。

于 2010-09-17T09:32:31.180 に答える
1

モジュールについては、以前から存在していたのではなく、何も知りません。最近は誰も使用していないようですので、おそらくどちらも使用しないでください。

pmモジュールに固執し、今は@ISAを無視してください。これはOOP用です。メソッドはいつでも完全に修飾された状態で呼び出すことができるため、エクスポートもそれほど重要ではありません。

だからこれを書くのではなく:

ファイル:MyPkg.pm

package MyPkg;
@EXPORT = qw(func1 func2);

sub func1 { ... };
sub func2 { ... };

ファイル:main.pl

#!/usr/bin/perl
use strict;
use warnings;

use MyPkg;

&func1();

最初に、次のように書く必要があります。

ファイル:MyPkg.pm

package MyPkg;

sub func1 { ... };
sub func2 { ... };

ファイル:main.pl

#!/usr/bin/perl
use strict;
use warnings;

use MyPkg;

&MyPkg::func1();

そして、後で実際にエクスポートする必要があるメソッドを確認したら、既存のコードを変更せずにエクスポートできます。

この使用により、モジュールがロードされ、importが呼び出されます。これにより、現在のパッケージでEXPORTされたサブが使用可能になります。秒の例では、requireが実行しますが、これはimportを呼び出しませんが、私は常に'use'を使用する傾向があります。

于 2010-09-17T09:21:52.527 に答える