설치된 CPAN 모듈 목록은 어떻게 얻습니까?


88

노력하는 것 말고

perldoc <module name>

개별적으로 내 마음에 드는 CPAN 모듈이나 파일 시스템을 살펴보고 디렉토리를 살펴보면 어떤 모듈이 설치되어 있는지 알 수 없습니다.

설치된 모든 CPAN 모듈의 큰 목록을 얻는 가장 쉬운 방법은 무엇입니까? 명령 줄 또는 기타에서.


pmtools , 특히 정규 표현식을 받아들이는 pminst 사용을 제안 할 수 있습니다 .
lukmdo

perl-pmtools 는 좋은 도구입니다.
jaseywang

어떤 모듈이 설치되어 있는지 또는 어떤 배포판이 설치되었는지 알고 싶습니까?
Tim Bunce 2013 년

4
나는 cpan -l창문에서 나 자신에게 유용하다는 것을 알았 습니다.
무효화

1
이 유용 할 수 있습니다 :instmodsh
라비

답변:


65

이것은 Perl FAQ에서 답을 찾을 수 있습니다 perldoc -q installed.. 요컨대, 이 스레드에서 이전에 다루었던 두 가지 변형 을 사용 ExtUtils::Installed하거나 사용 File::Find하는 것으로 귀결됩니다.

FAQ 항목 "내 시스템에 설치된 모듈을 어떻게 찾습니까?"를 찾을 수도 있습니다. perlfaq3에서. perlfaq 에서 모든 FAQ 답변 목록을 볼 수 있습니다.


36
이것은 OP가 요청한 것보다 훨씬 더 많은 것을 제공하여 사실상 쓸모가 없습니다.
Justin

2
cpan -l은 내가 실행하는 디렉토리에 대해 재귀 검색을 수행합니다. 해당 명령 줄에서 ExtUtils::Installed생성자의 skip_cwd옵션 을 전달할 방법이 있습니까?
Mark Reed

10
FAQ에 사용하라고 나와 cpan -l있지만 RHEL6에서 작동하지 않고 /usr/bin/cpan -l오류가 발생 Unknown option: l합니다.
Stefan Lasiewski

1
$ perldoc perllocal | grep 모듈 $ perldoc perllocal | 그렙 -E 'VERSION | 모듈'
caot

사용 perldoc을 -t perllocal 일반 텍스트 출력을 얻을 수 있습니다, 그렇지 않으면 그렙 수도 인해 임베디드 Ctrl 키를 문자로하지 작업
user333869

35
perldoc perllocal

편집 : CPAN FAQ 에 (약간) 더 많은 정보가 있습니다.


2
FAQ 링크에 감사드립니다. 불행히도 내가 아는 모든 모듈이 설치되어있는 것은 아닙니다. Date :: Calc도 거기에 표시되지 않습니다.
David McLaughlin

26

perldoc -q installed

cpan -l트릭 을 할 것이라고 주장 하지만 그것은 나를 위해 작동하지 않습니다. 다른 옵션 :

cpan -a

설치된 패키지의 멋진 목록을 뱉어 내고 파일에 쓰는 좋은 부작용이 있습니다.


2
기록을 위해 cpan -l작동합니다 (또는 CPAN v2.05로 나를 위해). cpan -a참으로 더 예뻐요.
William Turrell 2014

23

perldoc perllocal이 CPAN을 통해 설치된 모듈에 대해서만보고한다는 점은 주목할 가치가 있습니다. 누군가 수동으로 모듈을 설치하면 찾을 수 없습니다. 또한 여러 사람이 모듈을 설치하고 perllocal.pod가 소스 제어를받는 경우 사람들이 충돌을 잘못 해결하고 목록을 손상시킬 수 있습니다 (예를 들어 여기에서 발생했습니다).

유감스럽게도 솔루션은 File :: Find 또는 이와 유사한 것으로 @INC를 통해 걷는 것처럼 보입니다. 그러나 이는 모듈 만 찾는 것이 아니라 배포판에서 관련 모듈도 찾습니다. 예를 들어 Test :: Harness의 실제 배포 이름과 함께 TAP :: Harness 및 TAP :: Parser를보고합니다 (버전 3 이상이 있다고 가정). 잠재적으로 배포 이름과 일치시키고 일치하지 않는 이름을 버릴 수 있지만 로컬에서 빌드되고 설치된 모듈을 버릴 수 있습니다.

brian d foy의 backpan 인덱싱 작업에는 .pm 파일에 코드를 전달해야하며 배포를 유추하려고 시도하지만 패키지에있는 것이 반드시 설치되어 있지 않기 때문에 때때로 실패합니다 (Devel :: Cover 참조). :: Inc 예).


1
나는 그것을 위해 BackPAN 카탈로그 총을 꺼낼 필요가 없다고 생각합니다. 내가 Test :: Prereq로하는 것과 같은 것은 02packages에서 찾은 배포판으로 그것을 축소하는 것으로 충분할 수 있습니다. 그러나 모듈 파일을 나열하는 것보다 약간 더 까다 롭고 카탈로그는 아직 처리에 가깝지 않습니다.
brian d foy

2
초보적인 테스트 (내가 둘러싼 일부 디렉토리에서 "make -n install"수행)에서 MakeMaker 기반 모듈의 "make install"단계는 perllocal을 업데이트합니다. CPAN을 통해 직접 설치하는 것은 아닙니다.
rjray

1
저는 Dist :: Surveyor가 " 그 라이브러리에 어떤 배포판 이 설치되어 있는가?"라는 질문에 답하기위한 최고의 도구라고 생각 합니다. 자세한 내용은 이 프레젠테이션 을 참조하십시오. git repo 에 사용하기 쉬운 fatpacked 버전이 있습니다.
Tim Bunce 2013 년

20
$ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort
              Class::Inspector     *   "VERSION: 1.28"
                    Crypt::CBC     *   "VERSION: 2.33"
               Crypt::Rijndael     *   "VERSION: 1.11"
                    Data::Dump     *   "VERSION: 1.22"
                   DBD::Oracle     *   "VERSION: 1.68"
                           DBI     *   "VERSION: 1.630"
                   Digest::SHA     *   "VERSION: 5.92"
           ExtUtils::MakeMaker     *   "VERSION: 6.84"
                       install     *   "VERSION: 6.84"
               IO::SessionData     *   "VERSION: 1.03"
               IO::Socket::SSL     *   "VERSION: 2.016"
                          JSON     *   "VERSION: 2.90"
                  MIME::Base64     *   "VERSION: 3.14"
                  MIME::Base64     *   "VERSION: 3.14"
                   Mozilla::CA     *   "VERSION: 20141217"
                   Net::SSLeay     *   "VERSION: 1.68"
                        parent     *   "VERSION: 0.228"
                  REST::Client     *   "VERSION: 271"
                    SOAP::Lite     *   "VERSION: 1.08"
                  Task::Weaken     *   "VERSION: 1.04"
                 Term::ReadKey     *   "VERSION: 2.31"
                Test::Manifest     *   "VERSION: 1.23"
                  Test::Simple     *   "VERSION: 1.001002"
                  Text::CSV_XS     *   "VERSION: 1.16"
                     Try::Tiny     *   "VERSION: 0.22"
                   XML::LibXML     *   "VERSION: 2.0108"
         XML::NamespaceSupport     *   "VERSION: 1.11"
                XML::SAX::Base     *   "VERSION: 1.08"

2
이것은 cpan을 설치하지 않은 사람들에게 잘 작동합니다.
pdwalker

정말 과소 평가 된 답변입니다. 이것은 RHEL 배포에서도 작동합니다.
Cristina

4
나는 :No documentation found for "perllocal".
Luis A. Florit

예상보다 실행하는 데 더 오래 걸렸지 만 (내 컴퓨터에서 약 20 초 정도) 완벽하게 작동했습니다! 좋은 대답입니다.
Hans Goldman

19

ExtUtils-Installed를 시도해 볼 수 있지만 .packlists 만 보이 므로 사람들 @INC이 손 으로 물건을 옮긴 모듈을 놓칠 수 있습니다 .

내가 쓴 응용 프로그램 - 모듈 - 리스터를 비 쉘 웹 호스팅 계정에 CGI 스크립트로이 작업을 수행하고 싶어 친구. 모듈 파일을 가져 와서 서버가 CGI 스크립트로 취급 할 파일 이름으로 업로드하면됩니다. 표준 라이브러리 외부에는 종속성이 없습니다. 그대로 사용하거나 코드를 훔치십시오.

모듈 및 해당 버전 목록을 출력합니다.

타이 :: 사이클 1.15
타이 :: IxHash 1.21
타이 :: 토글 1.07
타이 :: ToObject 0.03
시간 :: CTime 99.062201
시간 :: DaysInMonth 99.1117
시간 :: 에포크 0.02
시간 :: 퍼지 0.34
시각 :: JulianDay 2003.1125
시간 :: ParseDate 2006.0814
시간 :: 시간대 2006.0814

이 기능을 cpan도구 의 기능으로 추가하려고 했기 때문에 그렇게 할 것입니다. 지금은이, [시간 통과] 그리고 -l에 스위치를 cpan. 릴리스하기 전에 몇 가지 다른 작업이 있지만 github에 있습니다. 그것을 기다리지 않으려면 -a목록에 Pod가 추가되지만 스위치를 사용하여 자동 번들을 만들 수 있습니다.

행운을 빕니다;


12

트릭을 수행하는 스크립트는 다음과 같습니다.

use ExtUtils::Installed;

my $inst = ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach $module (@modules){
       print $module ." - ". $inst->version($module). "\n";
}

=head1 ABOUT

This scripts lists installed cpan modules using the ExtUtils modules

=head1 FORMAT

Prints each module in the following format
<name> - <version>

=cut

RHEL 6.9에서이 스크립트는 다음 만 인쇄합니다. Perl - 5.10.1 모듈이 나열되지 않습니다.
Hans Deragon

9

이를 위해 CPAN 'r'명령을 사용하고 싶습니다. 이전 스타일로 CPAN 셸에 들어갈 수 있습니다.

sudo perl -MCPAN -e shell

또는 대부분의 최신 시스템에는 'cpan'명령이 있으므로 다음 명령을 사용하면 쉘로 이동합니다.

sudo cpan

(일반 사용자로 실행할 수 있도록 cpan을 설정하지 않고 루트로 설치하지 않는 한, 일반적으로 'sudo'를 사용하여 루트로 실행하거나 'su-'를 사용하여 루트로 설정해야합니다. 이 시스템에 루트가없는 경우에도 CPAN 셸을 사용하여이 정보를 찾을 수 있지만 모듈을 설치할 수 없으며 처음에 약간의 설정을 거쳐야 할 수 있습니다. 실행하십시오.)

그런 다음 cpan 셸에 들어가면 'r'명령을 사용하여 설치된 모든 모듈과 해당 버전을보고 할 수 있습니다. 따라서 "cpan>"프롬프트에서 'r'을 입력합니다. 설치된 모든 모듈과 버전이 나열됩니다. 사용하다 '?' 더 많은 도움을 받으려면


1
실제로 'r'은 재설치 권장 사항을 제공합니다. 즉, 최신 버전의 CPAN이있는 설치의 모든 모듈입니다. 설치가 매우 오래된 경우가 아니면 전체 목록이 아닙니다.
EvdB

내 'r'은 내가 강박 적으로 업그레이드하기 때문에 항상 아무것도보고하지 않습니다. 생각 나는군요 ... 오늘은 아직 업그레이드하지 않았습니다.
skiphoppy

3
-r은 물건을 다시 컴파일합니다. 목록을 얻으려면 -a를 시도하거나 최신 소스를 다운로드하고이 답변에 추가 된 새로운 -l 스위치로 재생하십시오. :)
brian d foy

1
sudo여기? 완전히 불필요합니다.
Aristotle Pagaltzis

2
'cpan'에 대한 '-r'명령 줄 인수와 cpan 셸의 'r'명령 간의 차이점에 유의하십시오. :)
EvdB

7

* nix에서 할 수있는 정말 엉뚱한 방법이 있습니다.별로 신경 쓰지 않는 것 (예 : warnings :: register 등)을 얻을 수 있지만 다음을 통해 액세스 할 수있는 모든 .pm 파일 목록을 제공해야합니다. 펄.


for my $path (@INC) {
    my @list = `ls -R $path/**/*.pm`;
    for (@list) {
        s/$path\///g;
        s/\//::/g;
        s/\.pm$//g;
        print;
    }
}


2
이것은 그가 원하는 것을 제공하지 않을 것입니다. 관련 파일을 배포별로 그룹화하지 않고 Perl 자체의 모든 핵심 * .pm 파일을 나열합니다.
rjray

7
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'

이것은 각 *.pm모듈에 대한 전체 경로를 명확하게 보여주기 때문에 매우 좋습니다 . 당신은 ... 많은 중복을 볼 수 있습니다
not2qubit

7

instmodsh터미널에서 명령 을 사용하여 시스템에 설치된 펄 모듈의 목록을 얻을 수 있습니다 . 출력을 향상시키기 위해 세 가지 옵션을 묻습니다.

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program

5

Linux / Unix에서는 다음과 같은 간단한 명령을 사용합니다.

perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );' 

모든 폴더를 스캔하고 @INC* .pm 파일을 찾습니다.


감사합니다! 매우 유용한.
not2qubit

감사합니다! 그것은 아마도 내가 그렇게 간결한 표현으로 배운 것 중 가장 perl 일 것이다.
ewd

4

다음 명령을 시도하십시오

instmodsh


가장 간단한 대답입니다. 고대 데비안 6 서버에서 잘 작동했습니다.
Dave Everitt



1

나는 정확히 이것을하기 위해 어제 perl 스크립트를 썼다. 스크립트는 구분 기호로 '::'를 사용하여 @INC에 설치된 펄 모듈 목록을 반환합니다. -를 사용하여 스크립트를 호출하십시오.

perl perlmod.pl

또는

perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)

지금은 소프트 링크를 되풀이하는 데 문제가 있었기 때문에 스크립트가 현재 디렉토리 ( '.')를 건너 뛰지 만 17 행의 grep 함수를 다음과 같이 변경하여 포함 할 수 있습니다.

  grep { $_ !~ '^\.$' } @INC

그냥,

@INC

스크립트는 여기 에서 찾을 수 있습니다.



1

ls (1)과 같은 외부 프로그램을 사용하지 않고 @INC 디렉토리 트리를 살펴 보려면 File::Find::Rule멋진 선언적 인터페이스가있는 모듈을 사용할 수 있습니다 .

또한 이전 Perl 버전에 동일한 모듈이 포함되어있는 경우 중복 항목을 필터링하려고합니다. 이를 수행하는 코드는 다음과 같습니다.

#! /usr/bin/perl -l

use strict;
use warnings;
use File::Find::Rule;

my %seen;
for my $path (@INC) {
    for my $file (File::Find::Rule->name('*.pm')->in($path)) {
        my $module = substr($file, length($path)+1);
        $module =~ s/.pm$//;
        $module =~ s{[\\/]}{::}g;
        print $module unless $seen{$module}++;
    }
}

실행이 끝나면 모든 모듈 이름이 % seen 해시의 키로 표시됩니다. 코드는 표시된 횟수 대신 키 값으로 표준 파일 이름 ($ file에 제공됨)을 저장하도록 조정할 수 있습니다.


1

다음은 나를 위해 일했습니다.

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'

1

perldoc 또는 다른 모듈을 설치할 수없고 사용 가능한 모듈 (CPAN 또는 기타)을 알고 싶은 모든 사람들은 다음이 linux 및 Mingw32 / 64에서 작동합니다.

grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq

예, 지저분합니다. 예, 아마도 원하는 것보다 더 많이보고합니다. 그러나 파일로 파이프하면 어떤 dbm 인터페이스가 있는지 쉽게 확인할 수 있습니다.

 grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq > modules-installed
 cat modules-installed | grep -i dbm 

AnyDBM_File;
Memoize::AnyDBM_File;
Memoize::NDBM_File;
Memoize::SDBM_File;
WWW::RobotRules::AnyDBM_File;

그게 내가이 페이지에 온 이유입니다 (실망)

(나는 이것이 OP의 질문에 정확하게 답하지 않는다는 것을 알고 있지만, 내가 한 것과 같은 이유로 여기에 온 모든 사람에게 게시하고 있습니다. 그것은 스택의 문제입니다 *** 당신이 질문을 찾는 것은 거의 불가능합니다 비록 그것이 존재하더라도 스택 ***은 거의 항상 구글의 최고 히트작입니다!)


이것은 나를 위해 일했습니다. 게시 해 주셔서 감사합니다. 종속성을 설치 / 업데이트 할 액세스 권한이 많지 않은 환경에서 필요했습니다.
Ashish Kumar


0

다음은 설치된 모듈 목록을 출력하는 Perl 한 줄입니다.

perl -MExtUtils::Installed -MData::Dumper -e  'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'

Data :: Dumper가 설치되어 있는지 확인하십시오.


2
이것은 'cpan -l'이 나열하는 5945 대신 약 15 개의 perl 모듈 만 나열합니다.
Paul Tomblin 2012 년

0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

Windows 사용자는 Windows 탐색기를 검색하기 만하면됩니다.


0

"perldoc -l"시도 :

$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm


0

@ JamesThomasMoon1979의 스크립트가 한 줄로 재 작성되었습니다.

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'

-1

Perl 스크립트를 입력하면 설치된 모든 모듈이 @INC의 폴더 아래에 .pm 파일로 표시되므로 작은 bash 스크립트가 작업을 수행합니다.

#!/bin/bash

echo -e -n "Content-type: text/plain\n\n"

inc=`perl -e '$, = "\n"; print @INC;'`

for d in $inc
do
   find $d -name '*.pm'
done

왜 안돼? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

Linux의 경우 가장 쉬운 방법은 다음과 같습니다.

dpkg -l | grep "perl"

1
영업 이익은 CPAN의 목록을 요청 펄이 (APT를 사용할 수있는 경우 어느 쪽도 영업 이익이 우리에게 없음) 시스템에 설치되어 있지 않은 경우 (펄) 모듈, 시스템에 설치된
ROLO

나는 펄 전문가는 아니지만 위의 명령에서 설치된 펄 모듈을 보았다. 여기서 완벽한 답이 아닐 수도 있습니다.
Yasiru G

-2

이것은 나를 위해 작동합니다

perl -e 'print join("\n",@INC,"")'

제한적이고 즉각적인 도움을 제공 할 수있는이 코드 스 니펫에 감사드립니다. 적절한 설명은 크게 장기 가치를 향상 할 보여줌으로써 이 문제에 대한 좋은 해결책이고, 다른 유사한 질문을 미래의 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Machavity

-3

이것이 제가하는 일입니다. perl -M{cpan_module}
오류가 발생하지 않으면 모듈이 설치되었을 가능성이 높습니다.


2
이것이 질문에 대한 답이라고 생각하지 않습니다. 이 제안을 사용하면 모듈별로 모듈을 살펴보고 어떤 모듈이 설치되었는지 확인하는 데 상당한 시간이 걸릴 수 있습니다.
Dave Newman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.