web-dev-qa-db-ja.com

Perlモジュールがコアであるか標準インストールの一部であるかをどのように判断できますか?

Perlモジュールがコアの一部であるかどうか(つまり、標準インストールの一部であるかどうか)を確認するにはどうすればよいですか?

を探しています:

  • コマンドラインコマンド:
  • コード内でチェックするPerlサブルーチン/関数

おそらく質問は次のようになります。マシンへのspecific Perlインストールで最初に提供されたモジュールをどのように知ることができますか? (実際には、現在はマシンへの特定のPerlインストールで最初に提供されたモジュールを確認するにはどうすればよいですか?と尋ねられます。)

現在、Perlの標準的なインストール全体がないように思われることを考えると、少なくともこの新しい質問への回答は、最初にインストールされたときのインストールで私が最初に持っていたものを教えてくれます。

その知識があり、元のインストーラーイメージ/パッケージを保持している場合OR正確なものをオンラインで再度取得する方法を知っている場合、どのモジュールが使用されるかを知っている複数のマシンに対して繰り返し可能なPerlインストールがあります存在し、どのモジュールが存在しないか。

さらに明確にするために、私は元々のインストールで何がcameであったか、そのインストールの一部としてどのモジュールが提供されたか、そして何が組み込まれたかを見ています。 [〜#〜] not [〜#〜]それ以降にインストールされたもの。

そして、私はこれを実行できるようにしたいインストールされているマシン上で。したがって、このために、私はインストールに依存して、元々何があったかについて何らかの形で記録を残します。

スピンオフの質問をしました:マシン上の特定のPerlインストールで最初に提供されたモジュールを確認するにはどうすればよいですか?(元々提供されていたモジュールを確認するにはどうすればよいですか?)マシンへの特定のPerlインストール?)

56
therobyouknow

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
60
toolic

「コア」のようなものはもうありません。以前は標準のPerlディストリビューションがありましたが、多くの人は標準のPerlディストリビューションを持っていません。オペレーティングシステムディストリビューションは、モジュールの追加または削除、モジュールの変更などによって変更します。標準分布が実際に標準であると信頼することはできません。一部のLinuxディストリビューションには、基本のPerlインストールの一部としてPerlドキュメントが含まれていません。

Module :: CoreList はコアではないため使用できないとのことですが、ファイルを作成できればモジュールをインストールできます。自分で書いたふりをすることもできます。

8
brian d foy

あなたはサブで 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
7
Greg Bacon

本当に怠け者のために、perldoc.Perl.org Webサイトに コアモジュールリスト があります。

3
Powerlord

次を使用できます(たとえば、Net::FTPを検索します)。

Perl -MNet::FTP -e 1

出力がない場合は、インストールされています。

その他のリソース

perldoc perlmodlib 
perldoc perllocal

perlmonksからのノード

1
ghostdog74

Gbaconのコメントへの応答で、あなたは答えがプラットフォーム中立であることを望んでいると言います。私はそのような解決策を知りませんが、それが正しい道でさえあるのだろうかと思います。

特定のマシンで調べることが目標の場合は、プラットフォームに付属のツールを使用します。 Debianでは、これにはdpkg(Debianシステムにプリインストールされている)またはapt-file(必ずしもプリインストールされていない)またはその他のAPTツールが含まれます。

例として、これの出力を見てください:

dpkg-query -L Perl | less

あなたは明らかに出力を解析する必要があるでしょう、しかしそれが問題のマシンに特有であるという理由だけでそれは私を出発点として思いますis

0
Telemachus
  • コマンドラインから:

    モジュールTie::Hashがインストールされているかどうかを知りたいとしましょう。
    調べるには、コマンドラインから次を実行します。

    Perl -MTie::Hash -e 1
    

    上記のコマンドから出力が得られない場合は、モジュールがインストールされています。エラーが発生した場合は、インストールされていません。

  • スクリプト内からこのチェックを行うには、 Module :: Load :: Conditional を利用できます。

0
codaddict