web-dev-qa-db-ja.com

Perlでは、.pm(Perlモジュール)ファイルと.pl(Perlスクリプト)ファイルの違いは何ですか?

.pm(Perlモジュール)と.pl(Perlスクリプト)ファイルの違いは何ですか?

ファイルから1を返す理由も教えてください。 2または何かを返す場合、エラーは生成されません。なぜPerlモジュールから1を返すのですか?

83
user380979

基本的に、使用するファイル拡張子は、Perlがそれらのファイルをどのように解釈するかに関して違いはありません。

ただし、パッケージ名に続く特定のディレクトリ構造に従って.pmファイルにモジュールを配置すると便利です。したがって、モジュールExample::Plot::FourDがあり、それを Example/Plot/FourD.pm のパスのディレクトリ@INCに配置すると、 use および require は、use Example::Plot::FourDのようにパッケージ名を指定すると正しいことを行います。

ファイルは、初期化コードが正常に実行されたことを示す最後のステートメントとしてtrueを返す必要があるため、そうでない場合はtrueを返すことが確実でない限り、1;でそのようなファイルを終了するのが慣例です。ただし、ステートメントを追加する場合に備えて、1;を配置することをお勧めします。

EXPRがベアワードの場合、requireは拡張子「.pm」を想定し、ファイル名の「::」を「/」に置き換えて、標準モジュールを簡単にロードできるようにします。この形式のモジュールのロードは、ネームスペースを変更するリスクはありません。

すべてのuseは、提供されたパッケージ名からファイル名を見つけ出し、requireブロック内のそれをBEGINブロックに入れ、パッケージでimportを呼び出します。 useを使用せずに手動でこれらの手順を実行することを妨げるものはありません。

たとえば、以下のExample::Plot::FourDパッケージをt.plというファイルに入れ、ファイルs.plのスクリプトにロードしました。

C:\Temp> cat t.pl
package Example::Plot::FourD;

use strict; use warnings;

sub new { bless {} => shift }

sub something { print "something\n" }

"Example::Plot::FourD"

C:\Temp> cat s.pl
#!/usr/bin/Perl
use strict; use warnings;

BEGIN {
    require 't.pl';
}

my $p = Example::Plot::FourD->new;
$p->something;


C:\Temp> s
something

この例は、モジュールファイルが1で終わる必要はなく、真の値で終わることを示しています。

74
Sinan Ünür