Programing

명령 줄에서 Perl 모듈이 시스템에 설치되어 있는지 어떻게 확인할 수 있습니까?

lottogame 2020. 12. 28. 07:45
반응형

명령 줄에서 Perl 모듈이 시스템에 설치되어 있는지 어떻게 확인할 수 있습니까?


내 시스템에 XML :: Simple이 설치되어 있는지 확인하려고했습니다.

perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'

위의 한 줄은 내 시스템에 설치된 모든 모듈을 나열하는 데 사용되었습니다. 그러나 XML 모듈을 나열하지 않습니다.

그러나 다음은 정상적으로 실행됩니다.

perl -e "use XML::Simple "

무엇이 문제일까요?


다음을 통해 모듈의 설치 경로를 확인할 수 있습니다.

perldoc -l XML::Simple

한 줄짜리 문제는 디렉토리 / 하위 디렉토리를 재귀 적으로 순회하지 않는다는 것입니다. 따라서 실용적인 모듈 이름 만 출력으로 얻습니다.


빠르고 더러운 :

$ perl -MXML::Simple -e 1

$ perl -MXML :: Simple -le 'print $ INC { "XML / Simple.pm"}'

perlvar 항목에서 %INC:

  • % INC

해시는 %INC비아 포함 된 각 파일 이름에 대한 항목을 포함 do, require또는 use운영자. 키는 지정한 파일 이름 (모듈 이름이 경로 이름으로 변환 됨)이고 값은 찾은 파일의 위치입니다. require연산자는 특정 파일이 이미 포함되었는지 여부를 확인하기 위해 해시를 사용합니다.

파일이 후크를 통해로드 된 경우 (예 : 서브 루틴 참조, 이러한 후크에 대한 설명 require 참조 ),이 후크는 기본적 %INC으로 파일 이름 대신에 삽입됩니다 . 그러나 후크는보다 구체적인 정보를 제공하기 위해 % INC 항목을 자체적으로 설정했을 수 있습니다.


예를 들어 DBI 모듈이 설치되어 있는지 확인하려면

perl -e 'use DBI;'

설치되지 않은 경우 오류가 표시됩니다. ( http://www.linuxask.com에서 )


당신이하고있는 일은 디렉토리로 반복되지 않습니다. 디렉토리의 루트 디렉토리에있는 모듈 만 나열합니다 @INC.

모듈 XML::Simple@INC아래 경로 중 하나에 XML/Simple.pm있습니다.

특정 모듈을 찾기 위해 위에서 말한 것.

CPAN여기에서 모든 모듈을 찾는 방법에 대해 설명합니다 . 설치된 모듈을 찾는 방법을 참조하십시오 .


모듈이 설치되었는지 빠르게 확인하려면 (최소한 Unix 시스템에서 Bash 를 쉘로 사용) 다음을 .bashrc 파일에 추가하십시오.

alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"

그런 다음 다음을 수행 할 수 있습니다.

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607

while (<@ INC>)

이것은 @INC의 경로를 공백으로 구분 된 문자열로 결합한 다음 문자열에서 glob ()을 호출 한 다음 공백으로 구분 된 구성 요소를 반복합니다 (파일 글 로빙 메타 문자가없는 경우).

@INC에 공백, \, [], {}, *,? 또는 ~가 포함 된 경로가 있고 안전한 대안을 피할 이유가없는 경우에는 제대로 작동하지 않습니다.

for (@INC)

Windows 에서 ActivePerl실행하는 경우 :

  • C:\>ppm query * 설치된 모든 모듈 목록을 얻으려면

  • C:\>ppm query XML-SimpleXML::Simple설치되어 있는지 확인하려면


귀하의 솔루션은 @INC 배열에 포함 된 각 디렉토리 경로의 루트에서만 찾습니다. 다음과 같은 재귀적인 것이 필요합니다.

 perl -e 'foreach (@INC) {
    print `find $_ -type f -name "*.pm"`;
 }'

@ user80168의 솔루션에 대한 Bravo (나는 여전히 \'s!)하지만 별칭 및 셸과 관련된 모든 이스케이프를 피하기 위해 :

%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; } 
    ? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" ) 
    : print "Not installed" ' $1

합리적으로 잘 작동합니다.

다음을 사용하는 가장 간단하고 "현대적인"접근 방식이 있습니다 Module::Runtime.

perl -MModule::Runtime=use_module -E '
     say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI

모듈이 설치되지 않은 경우 유용한 오류가 발생합니다.

Using -MModule::Runtime requires it to be installed (it is not a core module).

ReferenceURL : https://stackoverflow.com/questions/1039107/how-can-i-check-if-a-perl-module-is-installed-on-my-system-from-the-command-line

반응형