Perlモジュールがコアの一部であるかどうか(つまり、標準インストールの一部であるかどうか)を確認するにはどうすればよいですか?
を探しています:
おそらく質問は次のようになります。マシンへのspecific Perlインストールで最初に提供されたモジュールをどのように知ることができますか? (実際には、現在はマシンへの特定のPerlインストールで最初に提供されたモジュールを確認するにはどうすればよいですか?と尋ねられます。)
現在、Perlの標準的なインストール全体がないように思われることを考えると、少なくともこの新しい質問への回答は、最初にインストールされたときのインストールで私が最初に持っていたものを教えてくれます。
その知識があり、元のインストーラーイメージ/パッケージを保持している場合OR正確なものをオンラインで再度取得する方法を知っている場合、どのモジュールが使用されるかを知っている複数のマシンに対して繰り返し可能なPerlインストールがあります存在し、どのモジュールが存在しないか。
さらに明確にするために、私は元々のインストールで何がcameであったか、そのインストールの一部としてどのモジュールが提供されたか、そして何が組み込まれたかを見ています。 [〜#〜] not [〜#〜]それ以降にインストールされたもの。
そして、私はこれを実行できるようにしたいインストールされているマシン上で。したがって、このために、私はインストールに依存して、元々何があったかについて何らかの形で記録を残します。
スピンオフの質問をしました:マシン上の特定のPerlインストールで最初に提供されたモジュールを確認するにはどうすればよいですか?(元々提供されていたモジュールを確認するにはどうすればよいですか?)マシンへの特定のPerlインストール?)
Module :: CoreList モジュールの corelist コマンドは、モジュールがコアであるかどうかを判別します。
> corelist Carp
Carp was first release with Perl 5
> corelist XML::Twig
XML::Twig was not in CORE (or so I think)
これは、スクリプトで使用する1つの方法です。 Module::CoreList
PODは簡潔すぎます。呼び出すメソッドを見つけるには、ソースコードを探し回る必要があります。
use strict;
use warnings;
use Module::CoreList;
my $mod = 'Carp';
#my $mod = 'XML::Twig';
my @ms = Module::CoreList->find_modules(qr/^$mod$/);
if (@ms) {
print "$mod in core\n";
}
else {
print "$mod not in core\n";
}
__END__
Carp in core
「コア」のようなものはもうありません。以前は標準のPerlディストリビューションがありましたが、多くの人は標準のPerlディストリビューションを持っていません。オペレーティングシステムディストリビューションは、モジュールの追加または削除、モジュールの変更などによって変更します。標準分布が実際に標準であると信頼することはできません。一部のLinuxディストリビューションには、基本のPerlインストールの一部としてPerlドキュメントが含まれていません。
Module :: CoreList はコアではないため使用できないとのことですが、ファイルを作成できればモジュールをインストールできます。自分で書いたふりをすることもできます。
あなたはサブで perlmodlib
をチェックすることができます:
my %_stdmod;
sub is_standard_module {
my($module) = @_;
unless (keys %_stdmod) {
chomp(my $perlmodlib = `perldoc -l perlmodlib`);
die "cannot locate perlmodlib\n" unless $perlmodlib;
open my $fh, "<", $perlmodlib
or die "$0: open $perlmodlib: $!\n";
while (<$fh>) {
next unless /^=head\d\s+Pragmatic\s+Modules/ ..
/^=head\d\s+CPAN/;
if (/^=item\s+(\w+(::\w+)*)/) {
++$_stdmod{ lc $1 };
}
}
}
exists $_stdmod{ lc $module } ? $module : ();
}
使用例:
die "Usage: $0 module..\n" unless @ARGV;
foreach my $mod (@ARGV) {
my $stdmod = is_standard_module $mod;
print "$0: $mod is ", ($stdmod ? "" : "not "), "standard\n";
}
出力:
$ ./isstdmod thread :: shared AnyDBM_File CGI LWP :: Simple ./ isstdmod:threads :: shared is standard ./ isstdmod:AnyDBM_File is standard ./ isstdmod: CGIは標準です ./ isstdmod:LWP :: Simpleは標準ではありません
perldoc
は、間違いなくPerlの真のコアおよび標準インストールの一部です。たとえば、Perl-5.10.1のソースディストリビューションには次のものが含まれています。
perldoc.PL
、標準インストールの一部としてperldoc
を生成しますperlmodlib.PL
、標準インストールの一部としてperlmodlib.pod
を生成しますこれは新しい追加ではありません。約10年前のPerl-5.6.0には、真のコアである標準インストールの一部として perlmodlib
がありました。
これらのアイテムを含まないインストールは非標準です。はい、私はそれがあなたの観点からは学術的に見えるかもしれないことを感謝します、しかしあなたのベンダーのパッケージはそうでなければ動作するプログラムを壊す非標準のインストールを許可しました。
Debianのパッケージマネージャーを使用すると、標準のPerlインストールを取得できます。
$ apt-get --install-recommends install Perl
本当に怠け者のために、perldoc.Perl.org Webサイトに コアモジュールリスト があります。
次を使用できます(たとえば、Net::FTP
を検索します)。
Perl -MNet::FTP -e 1
出力がない場合は、インストールされています。
perldoc perlmodlib
perldoc perllocal
Gbaconのコメントへの応答で、あなたは答えがプラットフォーム中立であることを望んでいると言います。私はそのような解決策を知りませんが、それが正しい道でさえあるのだろうかと思います。
特定のマシンで調べることが目標の場合は、プラットフォームに付属のツールを使用します。 Debianでは、これにはdpkg
(Debianシステムにプリインストールされている)またはapt-file
(必ずしもプリインストールされていない)またはその他のAPT
ツールが含まれます。
例として、これの出力を見てください:
dpkg-query -L Perl | less
あなたは明らかに出力を解析する必要があるでしょう、しかしそれが問題のマシンに特有であるという理由だけでそれは私を出発点として思いますis。
コマンドラインから:
モジュールTie::Hash
がインストールされているかどうかを知りたいとしましょう。
調べるには、コマンドラインから次を実行します。
Perl -MTie::Hash -e 1
上記のコマンドから出力が得られない場合は、モジュールがインストールされています。エラーが発生した場合は、インストールされていません。
スクリプト内からこのチェックを行うには、 Module :: Load :: Conditional を利用できます。